这是我的代码:
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 许可协议
您在类的命名空间中定义
color
的事实(使其成为类属性)不会使其在方法主体中可用。方法(实际上是函数)主体中的名称在函数执行时解析,而不是在函数定义时解析,此时color
定义在类主体中的变量已经转换为类属性 -它们不是函数的非本地命名空间的一部分。现在,“正确”的解决方案取决于您想要实现的目标。
如果你所有的粒子实例都应该共享相同的“颜色”值,只需保留类属性并在你的初始化程序中删除实例 - 类属性可以直接从实例访问,所以
self.color
将自动解析至type(self).color
。请注意,这不会阻止您为每个实例分配颜色值 - 如果实例没有该名称的属性,则只能通过实例访问类属性,因此设置your_particle.color = something_else
(或self.color = ...
- 一样)稍后在您的代码中仍将创建一个实例属性并隐藏类级别的属性 - 但这通常被认为是不好的做法,因为它没有明确说明意图。如果你想要每个实例的颜色,最好的解决方案是去掉类级别的属性,只在初始化程序中设置颜色,即
或者(如果您希望能够在实例化时指定颜色):