描述符用于将访问对象属性转变成调用描述符方法
__get__、__set__以及__delete__任意实现其一就实现属性描述符
描述器的主要目的是提供一个挂钩,允许存储在类变量中的对象控制在属性查找期间发生的情况。
在属性查找期间,描述器由点运算符调用。如果使用 vars(some_class)[descriptor_name]
间接访问描述器,则返回描述器实例而不调用它。
描述器的使用贯穿了整个语言。就是它让函数变成绑定方法。常见工具诸如 classmethod()
, staticmethod()
,property()
和 functools.cached_property()
都作为描述器实现。
class Descriptor(object): def __get__(self, obj, objtype): print "get value=%s" % self.val return self.val def __set__(self, obj, val): print "set value=%s" % val self.val = valclass Stu(object): age = Descriptor()stu = Stu()stu.age = 12 # set value=12, obj=Stu()print stu.age # get value=12, obj=Stu(), objtype=Stu # 12