向对象添加值向所有相同类型的对象添加值

时间:2021-06-23 22:23:24

标签: python python-3.x list pgzero

我正在使用 pygame 库。我有 Actor 类(用于游戏对象)和 ActorContext 类(用于游戏对象列表):

class ActorContext:
    list = []
    alpha_range = 255
    time_diff = 0
    alpha_diff = 0

    def add(self, obj: Actor):
        self.list.append(obj)

在我的主应用中,我定义了对象:

enemy_context = ActorContext()
bullet_context = ActorContext()
dummy_context = ActorContext()

稍后,在一个循环中,我创建对象并将其添加到这些上下文中:

            if event.key == pg.K_e:
                e = Enemy(img_src=enemy)
                e.rand_change()
                e.rand_pos()
                enemy_context.add(e)
            if event.key == pg.K_r:
                if len(enemy_list) > 0:
                    enemy_context.remove(1)

问题是,当我调用 enemy_context.add(e) 时,在所有 对象列表中添加了相同的值:emergent_context、bullet_context 和 dummy_context

3 个答案:

答案 0 :(得分:2)

每个实例的属性应该在 __init__ 方法中初始化,而不是作为类属性。

class ActorContext:
    alpha_range = 255
    time_diff = 0
    alpha_diff = 0

    def __init__(self):
        self.list = []

    def add(self, obj: Actor):
        self.list.append(obj)

答案 1 :(得分:0)

你应该这样调整你的班级:

class ActorContext:
    alpha_range = 255
    time_diff = 0
    alpha_diff = 0

    def __init__(self):
        self.list = []

    def add(self, obj: Actor):
        self.list.append(obj)

这确保 list 是一个实例属性,而不是一个类属性。它现在对于 ActorContext 的所有实例都是分开的。

__init__(self) 函数就是所谓的 constructor - 每当您创建相关对象的实例时调用的特殊函数,例如 ActorContext()

答案 2 :(得分:0)

尝试像这样定义你的类 ActorContext :

class ActorContext:
    def __init__(self):
        self.list = []
        self.alpha_range = 255
        self.time_diff = 0
        self.alpha_diff = 0

    def add(self, obj: Actor):
        self.list.append(obj)

有效果吗?

相关问题