实例化对象时,python中的类变量是否充当实例变量?

问题描述

请考虑以下示例:

class Ciao():
    a = 1 
    def whatIsIt(self):
        print(self.a)

i = Ciao()
i.a = 2
i.whatIsIt() #Returns 2

我正在创建类Ciao的实例,修改类变量,然后在最后一行中将其打印出来。对我来说,在创建对象i之后,类变量a完全像该代码段中的实例变量一样起作用。

class Ciao2():
    def __init__(self):
        self.a = None
    def whatIsIt(self):
        print(self.a)
i = Ciao2()
i.a = 2
i.whatIsIt() #Returns 2

实例化对象后,类和实例变量之间是否有根本区别?

解决方法

是的,有根本的区别。可以看到变量是可变的(例如列表),并且您使用同一类的多个实例。对类变量所做的更改将继承所有实例,但对实例变量所做的更改将不会:

class Ciao():
    a = [1]
    
    def __init__(self):
        self.b = [1]
        
        
i1 = Ciao()
print(i1.a,i1.b)  # [1] [1]
i1.a.append(2)
i1.b.append(2)
print(i1.a,i1.b)  # [1,2] [1,2]

i2 = Ciao()
print(i2.a,i2.b)  # [1,2] [1]