Python中的类变量和实例变量
一、话不多先上代码
class A:
aa = 1
def __init__(self,x,y):
self.x = x
self.y = y
a = A(2,3)
print(a.x, a.y, a.aa) # 2,3,1
print(A.aa) # 1
print(A.x) # AttributeError:type object ‘A’ has no attribute ‘x’
其中aa
就是一个类变量。类中先初始化__init__()
构造函数,其中传进来的第一个参数self
是指类的一个实例。而传进来的参数x,y
也就实例化对象的参数。
二、属性修改
下面的内容都是基于上边最开始的代码
a = A(2,3)
A.aa = 11
print(a.x, a.y, a.aa) # 2,3,11
print(A.aa) # 11
修改类变量之后,相关实例对象查找其属性也会发生改变(a.aa
也变为11
)。
a = A(2,3)
A.aa = 11
a.aa = 100
print(a.x, a.y, a.aa) # 2,3,100
print(A.aa) # 11
添加a.aa = 100
之后,发现只有a.aa
发生了改变,A.aa
还是11
,即类中的属性没变。
赋值语句在实例化对象上操作时,类变量不会改变;又因为实例对象a
中没有aa
属性(变量),所以a.aa = 100
会使实例对象a
新建一个aa
属性(变量),并将其赋值100
。
a = A(2,3)
A.aa = 11
a.aa = 100
print(a.x, a.y, a.aa) # 2,3,100
print(A.aa) # 11
b = A(3,5)
print(b.aa) # 11
实例化一个b
对象,发现b.aa
并不是100
(a.aa
),而是之前的11
(A.aa
),,其实对象A(类)中的类变量是所有实例对象共享的。
小节
-
类变量和实例变量是相互独立的
-
在实例上用赋值语句会新建一个属性(变量)