如何在属性存在之前引用它 python
how to reference an attribute before it exists python
我正在 pygame 中编写游戏,我有一个 class,当您单击它时,它会显示每个建筑物的统计信息。 class 变量 current_hud 开始为 None,但是当单击建筑物时,它的值变成建筑物对象,因此当调用绘制函数时它只绘制所选建筑物的 HUD .
问题是,我试图在 HUD 中创建我的 "Text" class 的实例,但我收到 AttributeError: 'NoneType' object has no attribute 'name' 因为 self.current_hud 还不是一个对象,所以 self.current_hud.name 还不是一个属性。如何引用尚不存在的属性?等待实例化hud class 直到建筑物被点击后真的是唯一的选择吗?
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
您可以将该名称作为 Hud 的选项 class 并在实例化文本之前设置它 class。
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)
我正在 pygame 中编写游戏,我有一个 class,当您单击它时,它会显示每个建筑物的统计信息。 class 变量 current_hud 开始为 None,但是当单击建筑物时,它的值变成建筑物对象,因此当调用绘制函数时它只绘制所选建筑物的 HUD .
问题是,我试图在 HUD 中创建我的 "Text" class 的实例,但我收到 AttributeError: 'NoneType' object has no attribute 'name' 因为 self.current_hud 还不是一个对象,所以 self.current_hud.name 还不是一个属性。如何引用尚不存在的属性?等待实例化hud class 直到建筑物被点击后真的是唯一的选择吗?
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
您可以将该名称作为 Hud 的选项 class 并在实例化文本之前设置它 class。
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)