Ошибка атрибута: объект ‘str’ не имеет атрибута

#python #arrays #string

Вопрос:

Я довольно новичок в программировании на 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, что, черт возьми, я делаю здесь не так, и я понятия не имею. Если я поставлю ID2 или ID3 вместо self.displayAll(letsago), это отлично работает, но это бессмысленно, так как игрок не может контролировать, куда он хочет идти, поэтому я предполагаю, что что-то не так с попыткой соединить идентификатор с номером из словаря, но я понятия не имею, что делать и как это исправить.

Комментарии:

1. letsago является строкой, а не экземпляром userInterface .

2. Когда вы отправляете идентификатор комнаты в .displayAll() , убедитесь, что вы либо а) просматриваете комнаты в списке и извлекаете эту комнату (экземпляр интерфейса пользователя), а ЗАТЕМ вызываете .displayAll() ИЛИ передаете экземпляр интерфейса пользователя напрямую displayAll() .

3. Как только ваш код заработает, не стесняйтесь публиковать его в Обзоре кода , так как у меня есть несколько комментариев, которые не применимы в этой настройке. 😀

Ответ №1:

Проблема в вашем playerMovement методе. Вы создаете строковое имя переменных вашей комнаты ( ID1 , ID2 , ID3 ):

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

Однако то, что вы создаете, — это просто str . Это не переменная. Кроме того, я не думаю, что он делает то, что вы думаете, что он делает:

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

Если вам ДЕЙСТВИТЕЛЬНО нужно было найти переменную таким образом, вы могли бы использовать 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')
 

Однако вместо этого я бы настоятельно рекомендовал вам пересмотреть свой класс(классы). Ваш userInterface класс, по сути Room , является классом А. Он не должен обрабатывать движение игрока. Это должно быть в другом классе, может GameManager быть, или что-то в этом роде.