看到这里就让我想起了基于原型的继承。
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)
Sign in to make a reply
桑桑喵喵233
看到这里就让我想起了基于原型的继承。