2022年 11月 6日

python 类变量和实例变量

通常来说,实例变量是对于每个实例都独有的数据,而类变量是该类所有实例共享的属性和方法。

其实我更愿意用类属性和实例属性来称呼它们,但是变量这个词已经成为程序语言的习惯称谓。一个正常的示例是:

  1. class Dog:
  2. kind = '土狗' # class variable shared by all instances
  3. def __init__(self, name):
  4. self.name = name # instance variable unique to each instance
  5. def bark(self):
  6. print(f'a {self.kind} dog named {self.name} is barking:"汪汪!"')
  7. def changeKind(self,kindName):
  8. self.kind = kindName
  9. def changeName(self,name):
  10. self.name = name
  11. print('最初:------')
  12. d1=Dog('阿旺')
  13. d2=Dog('二蛋')
  14. d1.bark()
  15. d2.bark()
  16. print('\n修实例变量后:------')
  17. d1.changeKind('哈奇士')
  18. d2.changeName('查理')
  19. d1.bark()
  20. d2.bark()
  21. print('\n修类变量后:------')
  22. Dog.kind='藏獒'
  23. d3=Dog('翠花')
  24. d1.bark() # 不受影响 [self.kind一开始是指向类变量,经过重新赋值后,变成实例变量了]
  25. d2.bark() # 受影响 [之前创建的实例也是受影响的]
  26. 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