类属性和实例属性


01.类属性是类的属性,是类的所有实例对象共享的变量和方法。

  • 常用的类属性包括:
    • __qualname__,类的限定名。
    • __name__,类的名称。
    • __dict__,类的属性字典。


02.实例变量是每一个实例自己的变量,是自己独有的。

  • 同一个类的所有实例对象的属性是都独立的,互相之间不可共享。
  • 常用的实例属性包括:
    • __class__,对象的类型,返回创建该对象的类名称。
    • __dict__,对象的属性字典,仅包含对象的变量,不包括对象的方法。
      • 如果在类中定义了类的变量,则该变量不会出现在对象的属性字典中。
    • 实例获取变量的原理是:
      • 当获取实例变量时,先去实例的__dict__中获取:
      • 如果有该变量,则获取该变量。
      • 如果没有该变量,则通过实例的__class__找到类,通过类的__dict__获取变量。
    • 实例的同名变量会隐藏掉类变量。
  • 实例可以动态的增加和修改自己的属性,仅对实例自身生效,比如:
class Person(object):
    score = 1

    def __init__(self, name, level):
        self.name = name
        self.level = level


tom = Person('Tom', 2)
jack = Person('Jack', 3)
print(Person.score, tom.score, jack.score) # 1 1 1
Person.score = 5
print(Person.score, tom.score, jack.score) # 5 5 5
tom.score += 2
print(Person.score, tom.score, jack.score) # 5 7 5
Person.score += 3
print(Person.score, tom.score, jack.score) # 8 7 8
  • 第一次对Person.score赋值;获取实例属性时,tom和jack的实例__dict__中都没有该属性,于是去Person中获取。
  • 第二次对tom.score赋值:
    • tom.__dict__中没有该属性,于是去Person.__dict__中获取。
    • 修改实例的属性值,由于修改只对实例本身有效,于是不影响Person和jack的__dict__。
  • 第三次对Person.score赋值;
    • tom.__dict__中已有该属性,直接从tom.__dict中__获取。
    • jack.__dict__中没有该属性,从Person.__dict__中获取。
文档更新时间: 2021-02-01 22:56   作者:闻骏