web-dev-qa-db-ja.com

AttributeError: 'str'オブジェクトには属性がありません

私はpythonプログラミングにかなり慣れていないので、簡単なテキストアドベンチャーゲームを試してみたかったのですが、すぐに障害に遭遇しました。

class userInterface:
    def __init__(self, roomID, roomDesc, dirDesc, itemDesc):
        self.roomID = roomID
        self.roomDesc = roomDesc
        self.dirDesc = dirDesc
        self.itemDesc = itemDesc

    def displayRoom(self): #Displays the room description
        print(self.roomDesc)

    def displayDir(self): #Displays available directions
        L1 = self.dirDesc.keys()
        L2 = ""
        for i in L1:
                L2 += str(i) + " "
        print("You can go: " + L2)

    def displayItems(self): #Displays any items of interest
        print("Interesting items: " + str(self.itemDesc))

    def displayAll(self, num): #Displays all of the above
        num.displayRoom()
        num.displayDir()
        num.displayItems()

    def playerMovement(self): #Allows the player to change rooms based on the cardinal directions
        if input( "--> " ) in self.dirDesc.keys():
            letsago = "ID" + str(self.dirDesc.values())
            self.displayAll(letsago)
        else:
            print("Sorry, you can't go there mate.")



ID1 = userInterface(1, "This is a very small and empty room.", {"N": 2}, "There is nothing here.")

ID2 = userInterface(2, "This is another room.", {"W": 3}, ["knife", "butter"])

ID3 = userInterface(3, "This is the third room. GET OVER HERE", {}, ["rocket launcher"])

ID1.displayAll(ID1)
ID1.playerMovement()

それが私のコードであり、何らかの理由でそのエラーがスローされます:

Traceback (most recent call last):
  File "D:/Python34/Text Adventure/framework.py", line 42, in <module>
    ID1.playerMovement()
  File "D:/Python34/Text Adventure/framework.py", line 30, in playerMovement
    self.displayAll(fuckthis)
  File "D:/Python34/Text Adventure/framework.py", line 23, in displayAll
    num.displayRoom()
AttributeError: 'str' object has no attribute 'displayRoom'

私はインターネットで検索しましたpythonドキュメンテーションここで何が間違っているのか私にはわかりません。self.displayAll(letsagoの代わりにID2またはID3を置くと)それは完全に機能しますが、プレイヤーが行きたい場所を制御できないため、意味がありません。したがって、IDを辞書の番号に接続しようとすると何か間違っていると推測していますが、これを修正する方法。

10
user3683799

問題はplayerMovementメソッドにあります。ルーム変数の文字列名を作成しています(ID1ID2ID3):

letsago = "ID" + str(self.dirDesc.values())

ただし、作成するのはstrです。変数ではありません。さらに、私はそれがあなたがそれをしていると思うことをしているとは思わない:

>>>str({'a':1}.values())
'dict_values([1])'

[〜#〜] really [〜#〜]この方法で変数を見つける必要がある場合は、eval関数を使用できます。

>>>foo = 'Hello World!'
>>>eval('foo')
'Hello World!'

またはglobals関数:

class Foo(object):
    def __init__(self):
        super(Foo, self).__init__()
    def test(self, name):
        print(globals()[name])

foo = Foo()
bar = 'Hello World!'
foo.text('bar')

ただし、代わりにstronglyクラスを再考することをお勧めします。 userInterfaceクラスは、本質的にRoomです。プレイヤーの動きを処理するべきではありません。これは別のクラス内にある必要があります。おそらくGameManagerなどです。

6
BeetDemGuise