[英]understanding classes in python 2 [learn python the hard way exercise 43]
[英]Python Classes in 2 Files [Learn Python the Hard Way]
大家好,我目前正在完成Zed Shaw的“艱苦學習Python”,並且一直在練習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 ...對嗎?
如果有人可以幫助我了解這里發生的事情,我將不勝感激。
謝謝! 喬希
注意:我不熟悉這本書,因此不了解問題的內容,因此我的答案僅涉及顯示的代碼
這里的問題不是將代碼拆分為兩個文件。 據我所知, 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.