2个文件中的Python类[艰难学习Python]

时间:2011-02-22 07:48:15

标签: python

嘿伙计们, 我目前正在完成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中正确继承...对吗?

如果有人能帮我理解这里发生的事情,我将非常感激。

谢谢! 约什

2 个答案:

答案 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对象,但你不能像你想要的那样用一个字符串来做。