Game
和一些函数的练习:__init__
,play
,death
和另外四个。
我能够复制和修改各种条件的代码,但我想尝试将代码分成两个文件:一个包含类PrincessRoom
的文件,作为游戏的唯一空间,以及另一个包含大部分旧代码play
和death
。
来自ex43.py
from sys import exit
from random import randint
from ex43princess import PrincessRoom
class Game(object):
def __init__(self, start):
self.quips = [
"You died. You suck.",
"Hey, you died. Look at that.",
"You lose. I win. End.",
]
self.start = start
def play(self):
next = self.start
while True:
print "\n--------"
room = getattr(self, next)
next = room()
def death(self):
print self.quips[randint(0, len(self.quips)-1)]
exit(1)
a_game = Game("princess")
a_game.play()
来自ex43princess.py
class PrincessRoom(object):
def __init__(self):
pass
def princess(self):
print "text here"
raw_input("> ")
if raw_input == 1:
return 'eat_it'
else:
return 'death'
def eat_it(self):
print "text here"
当我运行代码时,这是我得到的错误:
Traceback (most recent call last):
File "ex43-2.py", line 29, in <module>
a_game.play()
File "ex43-2.py", line 21, in play
room = getattr(self, next)
AttributeError: 'Game' object has no attribute 'princess'``
现在我对原始代码a_game
初始化为a_game = Game("princess")
的原因不太了解,但我很确定这与我使用room = getattr(self, next)
的原因直接相关。但这是我的理解踌躇的地方。
如果内存服务,似乎Game
对象没有从ex43princess.py中正确继承...对吗?
如果有人能帮我理解这里发生的事情,我将非常感激。
谢谢! 约什
答案 0 :(得分:1)
注意:我不熟悉这本书,因此对问题的上下文不熟悉,所以我的答案仅涉及显示的代码
这里的问题不是将代码拆分为两个文件。据我所知,自己文件中的PrincessRoom
类没有真正的问题。
Game
无法找到princess
方法,也没有方法。也许它应该继承自PrincessRoom
?
那就是说,我不确定从名为Game
的类继承名为PrincessRoom
的类是否合乎逻辑。更好的方法是恕我直言聚合 - 即将一组房间保存为Game
的实例变量,并通过它访问它们。继承应该真正保留给 is-a 关系。你应该问问自己,“Game is-a PrincessRoom”是否合情合理。它可能没有。有意义的是“Game has-a PrincessRoom”, has -a 由OOP中的聚合表示。
答案 1 :(得分:0)
我快速而肮脏的练习版本43. Here。关键是你只是试图实例化PrincessRoom对象,但你不能像你想要的那样用一个字符串来做。