类变量:“类列表”与“类布尔值”

2024-10-01 04:47:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我不明白下面这个例子的区别。一次一个类的实例可以更改另一个实例的类变量,而另一次不能?你知道吗

例1:

class MyClass(object):
    mylist = []

    def add(self):
        self.mylist.append(1)

x = MyClass()
y = MyClass()
x.add()
print "x's mylist: ",x.mylist
print "y's mylist: ",y.mylist

输出:

x's mylist: [1]

y's mylist: [1]

因此这里类A的实例x能够访问和修改类属性mylist,它也是A的实例y的属性。你知道吗

例2:

class MyBank(object):
    crisis = False

    def bankrupt(self) :
        self.crisis = True

bankX = MyBank()
bankY = MyBank()
bankX.bankrupt()
print "bankX's crisis: ",bankX.crisis
print "bankY's crisis: ",bankY.crisis
^{2}$

为什么在本例中不起作用?你知道吗


Tags: 实例selfadd属性objectdefmyclassclass
1条回答
网友
1楼 · 发布于 2024-10-01 04:47:45

在第一种情况下,add方法中没有赋值:

def add(self):
    self.mylist.append(1)  # NOT self.mylist = something

在第二种情况下,有一项任务:

def bankrupt(self) :
    self.crisis = True  # self.crisis = something

当在实例上设置属性时,它总是只在特定实例上设置(它放在实例的__dict__属性中)。类__dict__不受影响。你知道吗

在第一种情况下,并没有赋值,所以标准的查找规则适用。因为实例的__dict__属性中没有“mylist”,所以它会返回到类__dict__。你知道吗

add中执行的操作会使存储在MyClass.__dict__中的值发生变化。这就是为什么变化在所有情况下都是可以观察到的。你知道吗

考虑以下片段(它可以更好地解释您的问题):

class MyClass:
    x = []

x1 = MyClass()
x2 = MyClass()
x3 = MyClass()

x1.x.append(1)

print x1.x  # [1]
print x2.x  # [1]
print x3.x  # [1]
assert x1.x is x2.x is x3.x

x3.x = "new"  # now x3.x no longer refers to class attribute

print x1.x # [1]
print x2.x # [1]
print x3.x # "new"
assert x1.x is x3.x  # no longer True!

相关问题 更多 >