gpt4 book ai didi

实例的python成员变量像成员变量一样工作,有些像静态变量一样工作

转载 作者:太空狗 更新时间:2023-10-29 19:33:23 24 4
gpt4 key购买 nike

我是 python 新手,类的成员变量在我的 python 代码中工作很奇怪。有些像普通变量一样工作,但有些像静态变量一样工作!

class Chaos:
list_value = []
value = "default"

def set_value(self, word):
self.list_value.append(word)
self.value = word

def show(self, num):
print(str(num) + "====")
print("value : " + self.value)
for st in self.list_value:
sys.stdout.write(st)
print("\n=====\n")

a = Chaos()
a.show(0)
a.set_value("A")
a.show(1)
b = Chaos()
a.show(2)
b.show(3)

结果

0====
value : default

=====

1====
value : A
A
=====

2====
value : A
A
=====

3====
value : default
A
=====

但是最后的测试结果和我上次测试的预期不一样。“b”实例的“list_value”中不应有“A”。它刚刚创建,之前从未添加过“A”。我将“A”添加到“a”的实例,而不是“b”。但是结果告诉我'b'中也有'A'此外,类中的“list_value”和“value”的工作方式不同。看起来两者具有相同的语法。为什么它们的工作方式不同?

最佳答案

这些实际上是类变量。要创建实例变量,请在 __init__ 函数中初始化它们:

class Chaos:
def __init__(self):
self.list_value = []
self.value = "default"

value 表现得像实例变量的原因是因为您使用 self.value 设置它。当 Python 看到 self.X 时,它会查看您的对象中是否有属性 X,如果没有,它会查看它的类。由于您从未设置过 self.list_value,它访问的是所有实例共享的类变量,因此任何修改都会反射(reflect)在所有其他对象中。

关于实例的python成员变量像成员变量一样工作,有些像静态变量一样工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9781334/

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