通常来说,实例变量是对于每个实例都独有的数据,而类变量是该类所有实例共享的属性和方法。
其实我更愿意用类属性和实例属性来称呼它们,但是变量这个词已经成为程序语言的习惯称谓。一个正常的示例是:
- 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:”汪汪!”
注意,对类变量重新赋值,可以影响到之前创建的实例的。
参考:https://www.cnblogs.com/crazyrunning/p/6945183.html