如何修复“NameError:名称‘color’未定义”?

新手上路,请多包涵

这是我的代码:

 size = (1280, 850)
Win = pygame.display.set_mode(size)
class Particle:
    color = (255, 255, 0)
    ID = 0

    def __init__(self, rect):
        Particle.ID += 1
        self.color = (color)
        self.ID = Particle.ID
        self.rect = rect

    def move(self, x, y):
        self.rect.move(x, y)

    def draw(self):
        pygame.draw.rect(Win, self.color, self.rect)

    def collide(self, rect1):
        return self.rect.colliderect(rect1)

当我运行我的项目时,我有:“self.color = (color) NameError: name ‘color’ is not defined”但是颜色被定义了……它在我的课程“Particle”的开头……

谢谢你帮我!

原文由 user12424147 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 3k
2 个回答

您在类的命名空间中定义 color 的事实(使其成为类属性)不会使其在方法主体中可用。方法(实际上是函数)主体中的名称在函数执行时解析,而不是在函数定义时解析,此时 color 定义在类主体中的变量已经转换为类属性 -它们不是函数的非本地命名空间的一部分。

现在,“正确”的解决方案取决于您想要实现的目标。

如果你所有的粒子实例都应该共享相同的“颜色”值,只需保留类属性并在你的初始化程序中删除实例 - 类属性可以直接从实例访问,所以 self.color 将自动解析至 type(self).color 。请注意,这不会阻止您为每个实例分配颜色值 - 如果实例没有该名称的属性,则只能通过实例访问类属性,因此设置 your_particle.color = something_else (或 self.color = ... - 一样)稍后在您的代码中仍将创建一个实例属性并隐藏类级别的属性 - 但这通常被认为是不好的做法,因为它没有明确说明意图。

如果你想要每个实例的颜色,最好的解决方案是去掉类级别的属性,只在初始化程序中设置颜色,即

class Particle:

    # better to make this an implementation attribute
    _ID = 0

    @classmethod
    def _next_id(cls):
        cls._ID += 1
        return cls._ID

    def __init__(self, rect):
        self.ID = self._next_id()
        self.color = (255, 0, 0)

或者(如果您希望能够在实例化时指定颜色):

     def __init__(self, rect, color=(255, 0, 0)):
        self.ID = self._next_id()
        self.color = color

原文由 bruno desthuilliers 发布,翻译遵循 CC BY-SA 4.0 许可协议

从技术上讲:您不需要实例属性 colorID 已经可用:

 class Particle:
    color = (255, 255, 0)
    ID = 0

    def __init__(self, rect):
        Particle.ID += 1
        self.rect = rect

        print(self.ID)
        print(self.color)

p = Particle(None)

输出:

 1
(255, 255, 0)

注意:如果您确实需要 colorID 作为 实例变量,请使用另一个名称:

 class Particle:
    color = (255, 255, 0)
    ID = 0
    def __init__(self, rect):
        Particle.ID += 1
        self.rect = rect
        self.pcolor = self.color
        self.pID = self.ID

原文由 Maurice Meyer 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题