gpt4 book ai didi

python - 为什么类的新实例与其他实例共享成员?

转载 作者:行者123 更新时间:2023-11-28 20:54:47 24 4
gpt4 key购买 nike

class Ball:
a = []
def __init__(self):
pass

def add(self,thing):
self.a.append(thing)

def size(self):
print len(self.a)

for i in range(3):
foo = Ball()
foo.add(1)
foo.add(2)
foo.size()

我希望返回:

2
2
2

但是我得到:

2
4
6

这是为什么?我发现通过在 init 中执行 a=[],我可以绕过这种行为,但我不太清楚为什么。

最佳答案

我刚刚弄明白为什么。

在上面的例子中,a 是一个类属性,而不是数据属性 - 这些属性由所有 Balls() 共享。注释掉 a=[] 并将其放入 init block 意味着它是一个数据属性。 (而且,那时我无法使用 foo.a 访问它,无论如何我都不应该这样做。)看起来类属性就像类的静态属性一样,它们由所有实例共享。

哇哦。

但有一个问题:CodeCompletion 很糟糕。在 foo 类中,我不能做 self.(variable),因为它不是自动定义的——它是由函数定义的。我可以定义一个类变量并将其替换为数据变量吗?

关于python - 为什么类的新实例与其他实例共享成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/307729/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com