通常来说,实例变量是对于每个实例都独有的数据,而类变量是该类所有实例共享的属性和方法。
其实我更愿意用类属性和实例属性来称呼它们,但是变量这个词已经成为程序语言的习惯称谓。一个正常的示例是:
class Dog:
kind = '土狗' # class variable shared by all instances
def __init__(self, name):
self.name = name # instance variable unique to each instance
def bark(self):
print(f'a {self.kind} dog named {self.name} is barking:"汪汪!"')
def changeKind(self,kindName):
self.kind = kindName
def changeName(self,name):
self.name = name
print('最初:------')
d1=Dog('阿旺')
d2=Dog('二蛋')
d1.bark()
d2.bark()
print('\n修实例变量后:------')
d1.changeKind('哈奇士')
d2.changeName('查理')
d1.bark()
d2.bark()
print('\n修类变量后:------')
Dog.kind='藏獒'
d3=Dog('翠花')
d1.bark() # 不受影响 [self.kind一开始是指向类变量,经过重新赋值后,变成实例变量了]
d2.bark() # 受影响 [之前创建的实例也是受影响的]
d3.bark() # 受影响
类Dog
中,类属性kind
为所有实例所共享;实例属性name
为每个Dog
的实例独有。
结果:
最初:------
a 土狗 dog named 阿旺 is barking:"汪汪!"
a 土狗 dog named 二蛋 is barking:"汪汪!"
修实例变量后:------
a 哈奇士 dog named 阿旺 is barking:"汪汪!"
a 土狗 dog named 查理 is barking:"汪汪!"
修类变量后:------
a 哈奇士 dog named 阿旺 is barking:"汪汪!"
a 藏獒 dog named 查理 is barking:"汪汪!"
a 藏獒 dog named 翠花 is barking:"汪汪!"
注意,对类变量重新赋值,可以影响到之前创建的实例的。