簡體   English   中英

2個文件中的Python類[艱苦學習Python]

[英]Python Classes in 2 Files [Learn Python the Hard Way]

大家好,我目前正在完成Zed Shaw的“艱苦學習Python”,並且一直在練習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 ...對嗎?

如果有人可以幫助我了解這里發生的事情,我將不勝感激。

謝謝! 喬希

注意:我不熟悉這本書,因此不了解問題的內容,因此我的答案僅涉及顯示的代碼

這里的問題不是將代碼拆分為兩個文件。 據我所知, PrincessRoom類在其自己的文件中沒有出現任何實際問題。

Game找不到princess方法,也沒有。 也許它應該繼承自PrincessRoom

就是說,我不確定從名為PrincessRoom的類繼承名為Game的類在邏輯上是否有意義。 恕我直言,更好的方法是聚合 -即保留房間的集合作為Game的實例變量,並通過Game訪問它們。 繼承應該真正保留給is-a關系。 您應該問自己,“ Game is-a PrincessRoom”是否有意義。 可能不是。 有意義的是“游戲has-a PrincessRoom”,而has-a由OOP中的聚合表示。

我的快速和骯臟的版本鍛煉43. 這里 關鍵是您只是試圖實例化PrincessRoom對象,但是不能像您嘗試的那樣僅使用字符串來實現它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM