как ссылаться на атрибут до того, как он существует python

Я пишу игру в pygame, и у меня есть класс, который отображает хедз-ап со статистикой для каждого здания, когда вы нажимаете на него. переменная класса current_hud начинается со значения None, но при щелчке по зданию ее значение становится объектом здания, так что при вызове функции рисования она рисует только корпус выбранного здания.

Проблема в том, что я пытаюсь создать экземпляр моего класса «Текст» в hud, но я получаю AttributeError: объект «NoneType» не имеет атрибута «имя», потому что self.current_hud еще не является объектом , поэтому self.current_hud.name еще не является атрибутом. Как сослаться на несуществующий атрибут? ждет, чтобы создать экземпляр класса hud до тех пор, пока здание не будет нажато, действительно единственный вариант?

 class Hud:
    current_hud = None
    def __init__(self,x,y):
        self.x = x
        self.y = y
        self.name_text = Text(x,y,str(self.current_hud.name), (0,0,0), 36)

    def draw(self):
        if Hud.current_hud == self:
            self.square = pygame.Rect((self.x,self.y),(440,400))
            pygame.draw.rect(screen,(255,255,255),self.square)
            self.name_text.x = self.x + 10
            self.name_text.y = self.y + 20

извините, если это запутанно, но это немного сложно объяснить. Полный код находится здесь, если вы хотите запустить его и посмотреть, как все это работает: https://github.com/hailfire006/economy_game/blob/master/economy_game.py


person user3150635    schedule 28.07.2015    source источник
comment
Похоже на проблему XY. Взгляните еще раз на то, что вы собираетесь сделать, и попытайтесь придумать более простой способ сделать это.   -  person TigerhawkT3    schedule 28.07.2015
comment
Можете ли вы просто установить текущий HUD при первом создании экземпляра? (например, if self.current_hud is None: self.current_hud = self)   -  person Patrick Maupin    schedule 28.07.2015


Ответы (1)


Вы можете взять имя в качестве опции для класса Hud и установить его перед созданием экземпляра класса Text.

 class Hud:
    current_hud = None
    def __init__(self,x,y,name):
        self.x = x
        self.y = y
        self.current_hud.name = name
        self.name_text = Text(x,y,str(self.current_hud.name), (0,0,0), 36)

    def draw(self):
        if Hud.current_hud == self:
            self.square = pygame.Rect((self.x,self.y),(440,400))
            pygame.draw.rect(screen,(255,255,255),self.square)
            self.name_text.x = self.x + 10
           self.name_text.y = self.y + 20

В вашем полном примере кода это выглядит так, когда вы создаете экземпляр здания, у вас есть его имя, и затем вы можете передать его в Hud при создании экземпляра.

class Building:
    def __init__(self,posX,posY,color,name):
        self.hud = Hud(0,0,name)
person Steve O'Driscoll    schedule 28.07.2015
comment
это было то, что мне было нужно, я никогда не думал о том, чтобы передать его как переменную экземпляра, но теперь это кажется очевидным... - person user3150635; 28.07.2015