Python Voxel类出现AttributeError:已传colour参数仍提示无该属性
问题分析与解决方案
问题根源
- 属性未提前初始化:你的
Voxel类在__init__方法里仅把colour参数传给父类Button的color属性,但没有给Voxel实例自身绑定self.colour属性。只有start_game方法会设置self.colour,快速点击时,新创建的Voxel实例可能还没执行start_game就被触发访问self.colour,直接抛出AttributeError。 - 拼写混用导致混乱:Ursina框架的
Button类用美式拼写color作为颜色属性,你自己用了英式拼写colour,两者混用加剧了属性管理的混乱。 - 颜色覆盖逻辑冲突:按1键设置绿色后放置方块变白色,是因为
start_game强制将self.colour设为白色,覆盖了之前的颜色设置,且未同步到父类的color属性(或同步逻辑有误)。
修复方案
1. 初始化实例属性,避免未定义错误
在Voxel的__init__方法中,除了给父类color赋值,同时初始化self.colour,确保实例创建时就拥有该属性:
from ursina import Button, Ursina, color class Voxel(Button): def __init__(self, colour, **kwargs): # 同时初始化自身的colour属性和父类的color属性 self.colour = colour super().__init__(color=self.colour, **kwargs) def start_game(self): # 修改colour后同步到父类的color属性,确保视觉生效 self.colour = color.white self.color = self.colour
2. 统一颜色属性拼写
建议全程使用Ursina框架的美式拼写color,避免拼写混淆,简化逻辑:
class Voxel(Button): def __init__(self, color, **kwargs): super().__init__(color=color, **kwargs) # 若需要自身维护颜色属性,直接复用框架命名 self.color = color def start_game(self): self.color = color.white
3. 调整触发逻辑,确保方法执行顺序
检查按键触发放置方块的代码,确保start_game在实例创建后及时执行,或者不依赖start_game初始化颜色:
next_voxel_color = color.white # 默认颜色 def input(key): global next_voxel_color if key == '1': next_voxel_color = color.green if key == 'left mouse down': new_voxel = Voxel(colour=next_voxel_color) # 立即调用start_game,避免延迟导致属性未定义 new_voxel.start_game()
关键注意点
- 优先遵循Ursina框架的属性命名规则,减少拼写错误。
- 实例属性必须在使用前完成初始化,避免因快速操作导致的属性未定义问题。
内容的提问来源于stack exchange,提问作者coolCoder
相关产品推荐
相关产品推荐

