Неразрешенная ссылка на атрибут ‘…’ для класса ‘…’

#python #pygame #pycharm

#python #pygame #pycharm

Вопрос:

Когда я вызываю метод render () в классе Zombie, я хочу добавить экземпляр объекта Zombie в ZombieList.list. Когда я пытаюсь это сделать, он говорит

Неразрешенная ссылка на атрибут list для класса ZombieList .

Должен ли я попытаться сделать это другим способом?

 class ZombieList:
    def __init__(self):
        self.list = []
        for zombie in self.list:
            ds.blit(zombie.image, (1000, random.randint(10, 790)))

class Zombie(object):
    def __init__(self):
        self.attack = 3
        self.speed = 5
        self.health = 30
        self.image = pygame.image.load("Assets/green zombie.png")

        self.zombieList = []

    def render(self):
        ZombieList.list.append(self)
  

Ответ №1:

Вы должны создать ZombieList объект, к которому вы можете добавлять Zombie объекты.
Вы можете добавить объекты класса в к классу Zombie :

 class Zombie(object):

    zombies = ZombieList()

    def __init__(self):
        self.attack = 3
        self.speed = 5
        self.health = 30
        self.image = pygame.image.load("Assets/green zombie.png")

    def render(self):
        Zombie.zombies.list.append(self)
  

Ответ №2:

Вы не можете добавить к списку класса. Вам нужно добавить к экземпляру класса. Например:

 class ZombieList:
    def __init__(self):
        self.list = []
        for zombie in self.list:
            ds.blit(zombie.image, (1000, random.randint(10, 790)))

my_zombie_list = ZombieList() # create an instance

class Zombie(object):
    def __init__(self):
        self.attack = 3
        self.speed = 5
        self.health = 30
        self.image = pygame.image.load("Assets/green zombie.png")

        self.zombieList = []

    def render(self):
        my_zombie_list.list.append(self) # refer to the previously created instance
  

Ответ №3:

list В ZombieList нет атрибута. Только после того, как вы создали ZombieList через, например, self.zombie_list = ZombieList() , вы сможете использовать свой список через self.zombie_list.list .

Даже тогда, однако, я полагаю, что это, вероятно, не тот дизайн, к которому вы стремитесь: я полагаю, что вы не хотите ZombieList для каждого отдельного Zombie . Скорее всего, тот, кто инициализирует Zombie объекты, вероятно, также должен отвечать за обслуживание ZombieList экземпляра.

Вы также столкнетесь с другими проблемами. Например, цикл в

 self.list = []
for zombie in self.list:
    ds.blit(zombie.image, (1000, random.randint(10, 790)))
  

никогда не будет иметь никакого эффекта, поскольку self.list всегда пусто при выполнении этого кода (поскольку вы определили его как пустой в предыдущей строке).