AttributeError: тип объекта не имеет атрибута (проблема с * args?) - PullRequest
0 голосов
/ 29 апреля 2020

Примечание: это не дубликат AttributeError: тип объекта не имеет атрибута . Я пытаюсь написать текстовое приключение.

class place(object):
    def __init__(self):
        super(place, self).__init__()
        self.directions = {
            "N":None,
            "S":None,
            "E":None,
            "W":None,
            "NE":None,
            "NW":None,
            "SE":None,
            "SW":None
        }


    def add_directions(self, *args): #There's a problem with putting *args because it takes self as string
        #I'm sure there is a more elegant way to do this
        for direction in args:
            for key in self.directions:
                self.directions[key] = direction
        print(self)

place()
place.add_directions(place, "The Dark Room")

Я хочу sh добавить «Темную комнату» в переменную класса «self.directions». Однако всякий раз, когда я делаю это, они выдают такую ​​ошибку:

"C:\Program Files (x86)\Python38-32\python.exe" "C:/Users/samue/Documents/School/Y3 2020/Computer Science/Python/TextAdventure/The Dark Asylum.py"
Traceback (most recent call last):
  File "C:/Users/samue/Documents/School/Y3 2020/Computer Science/Python/TextAdventure/The Dark Asylum.py", line 25, in <module>
    place.add_directions(place, "No")
  File "C:/Users/samue/Documents/School/Y3 2020/Computer Science/Python/TextAdventure/The Dark Asylum.py", line 20, in add_directions
    for key in self.directions:
AttributeError: type object 'place' has no attribute 'directions'

Я знаю, что мое понимание объектов не так уж и хорошо, но кто-то может помочь мне назначить отдельные направления в строке каждому ключу в переменной класса self.directions? Что-то не так с *args в функции add_directions?

Ответы [ 3 ]

1 голос
/ 29 апреля 2020

Вам необходимо создать экземпляр места класса. place () - это экземпляр класса place, а place - сам класс. Также вам не нужно передавать аргумент для себя. Это будет передано автоматически. Ваш код должен быть

p = place()
p.add_directions("The Dark Room")

PS По соглашению, вы должны использовать заглавную первую букву класса

1 голос
/ 29 апреля 2020

place.add_directions(place, "The Dark Room") В этой строке вы ссылаетесь на место класса, а не на экземпляр класса места,

В python и других объектно-ориентированных языках программирования сначала необходимо создать экземпляр или инициализировать класс, прежде чем получить доступ к своим членам.

place_instance = place()
place_instance.add_directions("The Dark Room")

Нет необходимости передавать класс как self, как вы это сделали, self необходимо определять методы, а не при вызове методов.

Чтобы создать этот код более читабельным, рассмотрите использование заглавной буквы для места. Можно записать как class Place()

1 голос
/ 29 апреля 2020

Проблема в последних двух строках:

place()
place.add_directions(place, "The Dark Room")

Должно быть:

p = place()
p.add_directions("The Dark Room")

Вы вызывали конструктор place, но нигде не назначали его. Вам не нужно передавать place для self, часть p в p.add_directions автоматически self.

...