Discuss / Python / 总结,关于动态类继承特性

总结,关于动态类继承特性

Topic source

看到这里就让我想起了基于原型的继承。

  • 向基于原型的继承生成的对象上添加属性方法,并不会影响其他基于同一原型实现的其他对象
  • 在原型上添加属性方法,则在由此原型生成的对象上都能使用
  • 调用一个属性或方法,如果当前对象上没有,则会在类(原型对象)上查找。表现为在类上添加属性,所有实例都可访问
  • slots只是限制该类生成的对象上的的属性,并不限制类本身(原型对象)上的属性
  • slots只限制本当前层次对象的属性,并不限制其子类对象的属性
  • 动态类实际上也是一个对象,类也是对象。type(object) == type,证明object类是type类的一个实例对象
class Person(object):
    __slots__ = ('name',)
#----------------------------
p1 = Person()
p2 = Person()
p1.name = 'xx'  # ok
try:
    p1.age =  10 # error
    print(p2.name) # error
except Exception as e:
    print('[Error]',e)
# ------------------------------
Person.age = 20 # 属性被挂载在类(原型)上,不受__slots__限制,等价于setattr(Person,age,10),且影响所有对象

print(p1.name,p1.age) # 这里p1.age首先从对象p1本身查找,没有找到就查找类上的属性,找到了直接输出20
# 因为实例p1被__slots__限制添加属性,但他的类上有属性,因此p1.age实际上调用的是类上挂载的属性
# 凡是对象调用类中的属性,那么该对象只有读取类中属性的权限,而没有改写类属性的权限
print(p1.age) # 20
print(p2.age) # 20
try:
    Person.age = 88 # 类自己改自己的属性无压力
    p1.age = 99 # 对象尝试在这里改写类属性,错误
except Exception as e:
    print('[Error]',e)
    print('After revise p1.age by Class = ',p1.age) # 输出 88 

# ----------------------------
class Stu(Person):
    pass
stu = Stu()
stu.age = 30 # 父类中的__slots__不会影响子类
print('stu s age is ',stu.age)

  • 1

Reply