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

时间:2012-03-20 04:26:21

标签: python

我是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'的工作方式不同。 看起来两者都有相同的语法。为什么他们的工作方式不同?

2 个答案:

答案 0 :(得分:21)

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

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

value的行为与实例变量相似的原因是因为您使用self.value进行设置。当Python看到self.X时,它会查看对象中是否有属性X,如果没有,则会查看其类。由于您从未设置self.list_value,因此它正在访问在所有实例之间共享的类变量,因此任何修改都将反映在每个其他对象中。

答案 1 :(得分:3)

关键区别在于您要追加到list_value,并且您要分配给value。它们被称为“类变量”。每个实例都有自己对类变量的引用,这就是共享列表的原因。但是,在分配时,您正在将该实例的引用更改为指向另一个变量,这解释了value的行为。

如果要查找来自list_value的实例变量行为,请在构造函数(名为__init__的类方法)中初始化它。