在两个文件中的Python类【艰难学Python】
大家好,
我现在正在完成Zed Shaw的“Learn Python the Hard Way”,最近在做第43个练习时遇到了一些困难,这个练习要求我们制作一个游戏。为了简单起见,我打算重写之前的练习,里面有一个叫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中继承……对吧?
如果有人能帮我理解这里发生了什么,我会非常感激。
谢谢!
Josh
2 个回答
这是我对第43个练习的一个简单粗糙的版本。在这里。关键是,你只是想创建PrincessRoom这个对象,但你不能像现在这样仅仅用一个字符串来实现。
注意:我对这本书不太熟悉,所以我的回答只针对显示的代码。
这里的问题不是把代码分成两个文件。根据我的观察,PrincessRoom
类放在自己的文件里并没有什么大问题。
Game
找不到 princess
方法,而且它本身也没有这个方法。也许它应该从 PrincessRoom
继承?
不过,我不太确定把一个叫 Game
的类从一个叫 PrincessRoom
的类继承是否合逻辑。我的看法是,使用 聚合 的方式会更好——也就是说,把一组房间作为 Game
的一个实例变量,然后通过它来访问这些房间。继承通常应该用于 是一个 的关系。你应该问自己,“Game 是一个 PrincessRoom 吗?”这个说法可能不太成立。更合理的说法是“Game 有一个 PrincessRoom”,而 有一个 在面向对象编程中用聚合来表示。