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

时间:2018-08-03 09:24:34

标签: python adventure

我试图将值从for lang in en de es; do echo $lang | php update.php || read x done 传递到另一个getattr,但是它仍然告诉我在Engine类中没有此参数。问题是如何将属性传递给Map类?它会继续在class Map()中查找属性。

class Engine()

class Engine(object):

追踪

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()

1 个答案:

答案 0 :(得分:0)

这是您需要解决的有关分解的内容:

  • 您应该将玩家的位置作为状态变量存储在Map中,而不是在Engine中。实际上,您应该将Map重命名为Location,因为它不仅记录了它们在哪里,还知道哪些动作是合法的并进行处理,然后更新到新位置。
  • Engine班级不需要知道玩家在哪里,只有他们是活着还是死了(他们所携带的东西,他们的能量水平,得分等)。
  • 因此,尝试初始化Engine("central_corridor")没有任何意义。 (顺便说一句,“ central_corridor”是一个字符串,Map.central_corridor是一个方法,但是这样做仍然是很糟糕的分解,您将无缘无故地将Engine耦合到Map)
  • Engine类不需要知道如何初始化Map实例
  • 那么如何编写Map类,使其将自身位置初始化为“ central_corridor”?

    • 位置应存储为数据成员(Map中的方法应设置或获取self.location = "central corridor", "bridge"),而不应存储为方法Map.central_corridor()Map.go_to_bridge()。当然,如果这样做,您需要为每个合法的源-目的地对位置使用一种方法,除非冒险是线性的,否则这将是不必要的。
  • 所以您当前的想法是将位置存储为Map中的方法名称,然后让Engine.play()遍历这些位置(方法名称)不是很好。

  • Engine.play只是让您头疼,不必要地传递来自Map的控制流<-> Engine和合法传递的位置
  • action也是哪里来的?您会丢失一种要求玩家采取行动,拒绝并循环的方法,除非该方法能够识别出该位置的合法行为。
  • 并考虑应该如何Map类将状态(活动/死点)传递回Engine。作为字符串?作为布尔值?还是可以返回None来表明玩家已经死亡?
  • 那么解决方案是什么样的?
    • Map重命名为Location
    • Location会有一个成员where(或state或您想称呼它的任何成员)
    • EngineEngine.__init__仅需要定义self.location = Location()。在初始状态下没有通过。
  • Location类应该有一个大方法turn(),该方法检查self.location的当前值,打印任何相应的描述文本,调用一种方法来获取玩家的动作(可能想通过它)一系列法律行动(以字符串形式)),然后处理在该位置选择的行动,并确定下一个行动和下一个玩家状态(有效/无效)。