在两个文件中的Python类【艰难学Python】

0 投票
2 回答
1199 浏览
提问于 2025-04-16 12:16

大家好,

我现在正在完成Zed Shaw的“Learn Python the Hard Way”,最近在做第43个练习时遇到了一些困难,这个练习要求我们制作一个游戏。为了简单起见,我打算重写之前的练习,里面有一个叫Game的类和一些函数:__init__playdeath,还有四个对应游戏中每个“房间”的函数。

我能够复制并修改代码以适应不同的情况,但我想尝试把代码分成两个文件:一个文件包含一个叫PrincessRoom的类,作为游戏的唯一房间,另一个文件则包含大部分旧代码,比如playdeath

来自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 个回答

0

这是我对第43个练习的一个简单粗糙的版本。在这里。关键是,你只是想创建PrincessRoom这个对象,但你不能像现在这样仅仅用一个字符串来实现。

1

注意:我对这本书不太熟悉,所以我的回答只针对显示的代码。

这里的问题不是把代码分成两个文件。根据我的观察,PrincessRoom 类放在自己的文件里并没有什么大问题。

Game 找不到 princess 方法,而且它本身也没有这个方法。也许它应该从 PrincessRoom 继承?

不过,我不太确定把一个叫 Game 的类从一个叫 PrincessRoom 的类继承是否合逻辑。我的看法是,使用 聚合 的方式会更好——也就是说,把一组房间作为 Game 的一个实例变量,然后通过它来访问这些房间。继承通常应该用于 是一个 的关系。你应该问自己,“Game 是一个 PrincessRoom 吗?”这个说法可能不太成立。更合理的说法是“Game 有一个 PrincessRoom”,而 有一个 在面向对象编程中用聚合来表示。

撰写回答