Python对象描述符
描述符是干啥的:
描述符本质上就是一个新式类,至少实现了 __get__() , __set__(), __delete__(), 这3个方法当中的一个。
描述符是用来代理另外一个类的属性的, 必须把描述符定义在另外一个类的属性当中,不能定义在构造函数里。
__get__调用属性触发
__set__设置属性触发
__delete__删除属性触发
描述符分为2种:
第一种,至少实现了 __get__() 和 __set__()
第二种,没有实现 __set__()
基本描述
class Foo: def __set__(self, instance, value): print('__set__') def __get__(self, instance, owner): print('__get__') def __delete__(self, instance): print('__delete__') class Demo: x=Foo() def __init__(self,x): self.x=x # self.x被代理, 设置 self.x=x,触发 Foo的 __set__()方法 d=Demo(10) d.x # 触发 Foo的 __get__()方法 del d.x # 触发 Foo的 __delete__()方法
利用描述符来限定对象属性的类型
class Typed: def __init__(self,key,type): self.key=key self.type=type def __get__(self, instance, owner): print('__get__') return instance.__dict__[self.key] def __set__(self, instance, value): print('__set__') if type(value) is self.type: instance.__dict__[self.key]=value else: raise TypeError('属性【%s】的类型必须是%s'%(self.key,self.type)) def __delete__(self, instance): print('__delete__') del instance.__dict__[self.key] class People: name=Typed('name',str) age=Typed('age',int) salary=Typed('salary',float) def __init__(self,name,age,salary): self.name=name self.age=age self.salary=salary p=People('jack',23,1234) print(p.name)