2011-02-22 5 views
0

Hey guys 現在、Zed Shawの"Learn Python the Hard Way"を完成させています。私は、学習者にゲームを作成するよう指示するExercise 43に苦労しています。
__init__playdeath、およびゲーム内の各「部屋」のためのより多くの4:簡単にするために、私はクラスGameといくつかの機能があり、前の演習を書き換えしようとしています。Pythonクラスの2つのファイル[難解なPythonの方法]

さまざまな条件でコードをコピーして変更することができましたが、コードを2つのファイルに分割しようとしました.1つのファイルがクラスPrincessRoomをゲームの唯一の部屋とし、古いコードplaydeathの大部分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" 

から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() 

から

私は、コードを実行すると、ここで私が手にエラーがあります:

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 = Game("princess") buで初期化されたa_gameでした私はそれが私にroom = getattr(self, next)を使用している理由に直接関係していると確信しています。しかし、これは私の理解が衰えるところです。

メモリが提供されている場合、Gameオブジェクトがex43princess.py ...から適切に継承されていないように見えますか?

もし私がここで何が起こっているのか理解できるように助けてくれたら、私は非常に感謝しています。

ありがとうございます! ジョシュ

+0

ここであなたのゲームクラスは新しい 'PrincessRoom'オブジェクトを作成していますか?それはプリンセスにアクセスしようとしているし、実際のオブジェクトではないストリングだから不平を言う。 –

答えて

1

注:私の答えはここだけ

問題がにコードを分割されていません表示されるコードを指して、私は、この本に慣れていないよので、質問の文脈で2つのファイル。私の知る限り、PrincessRoomクラスはそれ自体のファイルで実際の問題はありません。

Gameは、princessメソッドを見つけることができず、それもありません。おそらくそれはPrincessRoomから継承されているはずですか?

つまり、PrincessRoomという名前のクラスからGameという名前のクラスを継承することは理にかなっていません。より良いアプローチIMHOはアグリゲーションになります。つまり、部屋のコレクションをインスタンス変数として、Gameにして、アクセスします。継承は、is-aリレーションに実際に予約する必要があります。 「Game is-a PrincessRoom」が理にかなっているかどうか、あなた自身に尋ねるべきです。おそらくそうではありません。 「Game has-a PrincessRoom」は意味があり、は-のOOPでの集計で表されます。

+0

ああ、あなたは絶対に正しい。私は複数のファイルを使用する方法を学ぶ方法を探していましたが、それは私がちょうど完全にそれをバングしたことが判明しました。 「is-a」対「a」差別化のおかげで、それは後の章の1つを説明します。再度、感謝します! –

0

運動の速く汚れたバージョン43. Here。キーは、あなたがPrincessRoomオブジェクトをインスタンス化しようとしているだけですが、あなたがしようとしているような文字列ではできません。

+0

あなたがそれを扱うことができると思うなら、もう少し複雑なものがあります:) http://python.pastebin.com/T06PVjiq –

+0

ああ、こんなにありがとう。私は最初に2番目のもので何が起こっていたのか理解していませんでしたが、私はそれをほとんど持っていると確信しています...もう一度勉強することに感謝します! –

関連する問題