类属性是属于一个类的变量,就像是C++中类的静态成员变量,你只需将该属性定义在所有方法的作用域外,即为类属性,但一般是紧跟在类名后面,类属性为所有实例所共有,你可以通过 类名.属性 来调用类属性
>>> class A: count = 0; #这就是类属性 def __init__(self): A.count += 1 #每次调用该方法 count 自增 1 def output(self): print(self.count) >>> a1 = A() >>> a1.output() 1 >>> A.count = 0 >>> A.count 0 >>> a1.output() (为什么会是0,后面会详细说明) 0
实例属性是属于实例自己的属性,你可以在任何方法中添加新的实例属性,甚至在类外添加,Python会在实例属性初次使用时,创建该属性并赋值
>>> class A: def __init__(self): self.num = 1 #添加实例属性num def again(self,name): self.name = name #添加实例属性name >>> a1 = A() >>> a1.num 1 >>> a1.name #这时实例 a1 中还没有实例属性 name Traceback (most recent call last): File "<pyshell#38>", line 1, in <module> a1.name #这时实例 a1 中还没有实例属性 name AttributeError: ‘A‘ object has no attribute ‘name‘ >>> a1.again(‘Jane‘) >>> a1.name #现在有了... ‘Jane‘ >>> a1.call = ‘123456‘ #添加a1的实例属性 call >>> a1.call ‘123456‘
继续看下面的例子:
[python] view plaincopy >>> class A: count = 0 def __init__(self): A.count += 1 def output(self): print(self.count) >>> a1 = A() >>> a2 = A() >>> a3 = A() >>> A.count # A的类属性count这时为3 3 >>> A.count = 2 #更改A的类属性为2 >>> a1.count,a2.count, a3.count, A.count #A的所有实例的count也同样改变 (2, 2, 2, 2) >>> a1.count = 5 #通过A的一个实例a1更改count >>> a1.count, a2.count, a3.count, A.count #只有a1的count发生改变 (5, 2, 2, 2) >>> A.count = 4 #再次更改A的类属性为4 >>> a1.count, a2.count, a3.count, A.count #这时a1的count还是保持为5 (5, 4, 4, 4)
解释为什么会是0?
先看代码:
class base: count = 0 def __init__(self): base.count += 1 def output(self): print(self.count) a1 = base() a2 = base() a3 = base() print(base.count) # 3 a1.output() # 3 这里实例属性与类仍然还是共同引用一个count对象 base.count += 4 a1.output() # 3+4 print(base.count) # 3 print(a1.count) # 3 同理,共同引用一个count对象 base.count = 0 当改变类属性count时,实例属性count也跟着会变化 print(a1.count) # 0
class base: count = 0 def __init__(self): base.count += 1 def output(self): print(self.count) a1 = base() a2 = base() a3 = base() print(base.count) # 3 a1.count = 9 这个实例属性从类属性中分离出去 base.count += 4 因此类属性count的改变不会影响到实例属性count print(base.count) # 7 print(a1.count) # 9 print(base.count) # 3 a1.count = 9 base.count += 4 print(base.count) # 7 a1.output() # 9
通过上面的例子我们可以看到,类属性为所有实例和类所共有,通过 类名.类属性 可以更改类属性,并且所有实例的类属性也随之改变,但通过 实例名.类属性 来改变类属性,该实例的该类属性会变为实例属性,而不影响其他实例的类属性,以后通过 类名.类属性 来更改类属性,也不会影响到该实例的这个属性了,因为它变为实例属性啦。
时间: 2024-10-06 01:52:16