Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将属性从一个类传递给另一个调用_Python_Adventure - Fatal编程技术网

Python 将属性从一个类传递给另一个调用

Python 将属性从一个类传递给另一个调用,python,adventure,Python,Adventure,我试图将值从getattr传递到另一个class Map(),但它仍然告诉我类引擎中没有此参数。问题是如何将属性传递给类映射?它将继续在类引擎()中查找属性 类引擎(对象): 回溯 回溯(最近一次呼叫最后一次): 文件“c:\Learn\u Python\u In\u the \u hard\u way\SourceCode\E42\u Class\u Execrise.py”,第175行,在a\u game.play()中 文件“c:\Learn\u Python\u In\u the \u

我试图将值从
getattr
传递到另一个
class Map()
,但它仍然告诉我类引擎中没有此参数。问题是如何将属性传递给类映射?它将继续在
类引擎()中查找属性

类引擎(对象):

回溯
回溯(最近一次呼叫最后一次):
文件“c:\Learn\u Python\u In\u the \u hard\u way\SourceCode\E42\u Class\u Execrise.py”,第175行,在a\u game.play()中
文件“c:\Learn\u Python\u In\u the \u hard\u way\SourceCode\E42\u Class\u Execrise.py”,第27行,In play Map=getattr(self,next)
AttributeError:“引擎”对象没有属性“中央走廊”

以下是关于分解需要解决的问题:

  • 您应该将玩家的位置作为状态变量存储在
    地图
    中,而不是
    引擎
    中。实际上,您应该将
    映射
    重命名为
    位置
    ,因为它不仅仅记录它们的位置,它知道哪些操作是合法的并处理它们,然后更新到新位置
  • 引擎
    职业不需要知道玩家在哪里,只要他们活着或死了(他们携带的是什么,他们的能量水平如何,分数等等)
  • 因此,试图初始化
    引擎(“中央走廊”)
    毫无意义。(顺便说一句,“central_走廊”是一个字符串,Map.central_走廊是一个方法,但这样做仍然是一个可怕的分解,您将无缘无故地将引擎耦合到Map)
  • 引擎
    类不需要知道如何初始化Map的实例
  • 那么,如何编写
    Map
    类,使其自身将其位置初始化为“central_走廊”

    • 位置应存储为数据成员(应设置或获取
      Map
      中的方法。Location=“central roadway”,“bridge”
),而不是作为方法
Map.central\u roadway()
Map.go\u to\u bridge()
。当然,如果你这样做了,你需要一个方法来处理每一个合法的来源-目的地对位置,这将是不必要的,除非冒险是非常线性的
  • 因此,您当前的想法是将位置存储为
    Map
    中的方法名,然后让
    Engine.play()
    在这些位置(方法名)中循环

  • Engine.play
    只会让你头疼从
    Map
    Engine
    和合法通过的位置不必要地传递控制流
  • 还有,
    动作
    来自哪里?您缺少一个方法来请求玩家采取行动,并拒绝和循环,除非它在该位置认可合法行动
  • 并考虑<代码> map < /COD>类应该如何通过状态(生存/死亡)返回到<代码>引擎< /代码>。作为一根绳子?作为布尔值?或者您可以返回
    None
    以指示玩家已死亡
  • 那么解决方案是什么样的呢?
    • 地图
      重命名为
      位置
    • Location
      将有一个成员
      where
      (或
      state
      或任何您想称之为的名称)
    • Engine
      Engine.\uuuu init\uuu
      只需定义
      self.location=location()
      。初始状态下禁止通行
  • Location
    类应该有一个大方法
    turn()
    ,它检查
    self.Location
    的当前值,打印任何相应的描述文本,调用一个方法来获得玩家操作(可能希望将一个法律操作列表作为字符串传递给它),然后处理该位置的选定动作,并确定下一个动作和下一个玩家状态(活动/死亡)

  • 您得到的错误的完整回溯是什么?我猜这与
    next=Map()
    有关,在这里您尝试初始化一个
    Map
    而没有参数,但是需要一个
    next
    参数。您在代码中哪里看到
    getattr()
    调用?如果您需要任何帮助,请发布一个正确的MCVE和完整的错误消息并进行回溯。对不起,我把我的另一个版本放在这里了。我又更新了一次。你的代码中有很多错误,你没有在这里关闭字符串:print(“在绘图时快速拉出你的爆炸机并开火”),play方法写得很糟糕,你应该重新考虑一下你的代码。好的,你需要决定你在哪里存储玩家的位置(大概是作为地图中的状态变量,而不是引擎).1)
    Engine
    类不需要知道玩家在哪里,只要他们活着或死了(他们携带的是什么,他们的能量水平是什么,分数等等)。所以尝试用
    引擎(“中央走廊”)初始化东西
    毫无意义。
    引擎
    类不需要知道如何初始化
    映射
    的实例。2)因此,如何编写
    映射
    类,使其自身将其位置初始化为“中央走廊”"? 2b)位置应存储为数据成员,而不是smci。我按照你说的重建了程序。很明显,我发现我完全不理解“类”的功能,这个问题太愚蠢了。但是再次感谢你指出我的问题。我应该读更多的文档,但一定要查看一般的代码审查
        def __init__(self,start):
            self.map = start
            self.quips = [
                "You died.  You kinda suck at this.",
                "Your mom would be proud. If she were smarter.",
                "Such a luser.",
                "I have a small puppy that's better at this."            
            ]
    
        def death(self):
            print (self.quips[randint(0,len(self.quips) - 1)])
            exit(1)
    
        def play(self):
            next = self.map
    
            while True:
                print ("\n------------------")
                # Trying to get attribute of object and pass to class Map.
                Map = getattr(self, next)
                next = Map()
    
    
    class Map():
    
        def __init__(self, next):
            self.map = next
    
        def central_corridor(self):
            print ("The Gothons of planet Percal #25 have invaded your ship and destryoed")
            if action == "shoot!":
               print ("Quick on the draw you yank out your blaster and fire)
               return 'death'
            elif action == 'tell a joke':
               print ("Lucky for you they made you learn Gothon insults in the academy")    
               return 'Go to bridge'
    
        def go_to_bridge(self):
            print ("You burst onto the Bridge with the neutron destruct bomb")
    a_game = Engine("central_corridor")
    
    a_game.play()