You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Voxel类出现AttributeError:已传colour参数仍提示无该属性

问题分析与解决方案

问题根源

  1. 属性未提前初始化:你的Voxel类在__init__方法里仅把colour参数传给父类Button的color属性,但没有给Voxel实例自身绑定self.colour属性。只有start_game方法会设置self.colour,快速点击时,新创建的Voxel实例可能还没执行start_game就被触发访问self.colour,直接抛出AttributeError。
  2. 拼写混用导致混乱:Ursina框架的Button类用美式拼写color作为颜色属性,你自己用了英式拼写colour,两者混用加剧了属性管理的混乱。
  3. 颜色覆盖逻辑冲突:按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 08:10:46