web-dev-qa-db-fra.com

AttributeError: l'objet 'str' n'a pas d'attribut

Je suis assez nouveau dans la programmation python et je voulais m'essayer à un simple jeu d'aventure texte, mais j'ai immédiatement trébuché sur un barrage routier.

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

C'est mon code, qui pour une raison quelconque jette cette erreur:

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'

J'ai cherché sur Internet et dans la documentation python ce que je fais de mal ici et je n'ai aucune idée. Si je mets ID2 ou ID3 à la place de self.displayAll (letsago ) cela fonctionne parfaitement, mais cela ne sert à rien puisque le joueur n'a aucun contrôle sur l'endroit où il veut aller, donc je suppose qu'il y a quelque chose de mal à essayer de connecter l'ID avec le numéro du dictionnaire, mais je n'ai aucune idée de quoi faire et Comment régler ceci.

10
user3683799

Le problème vient de votre méthode playerMovement. Vous créez le nom de chaîne de vos variables de pièce (ID1, ID2, ID3):

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

Cependant, ce que vous créez n'est qu'un str. Ce n'est pas la variable. De plus, je ne pense pas qu'il fait ce que vous pensez qu'il fait:

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

Si vous AVEZ VRAIMENT nécessaire pour trouver la variable de cette façon, vous pouvez utiliser la fonction eval:

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

ou la fonction 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')

Cependant, à la place, je voudrais fortement vous recommander de repenser vos classes. Votre classe userInterface est essentiellement une Room. Il ne devrait pas gérer les mouvements des joueurs. Cela devrait être dans une autre classe, peut-être GameManager ou quelque chose comme ça.

6
BeetDemGuise