描述符协议详解
Python 中描述符(Descriptor)协议是什么?__get__、__set__、__delete__ 方法如何工作?
回答
古法程序员
描述符是实现了 __get__、__set__、__delete__ 中任意方法的对象,用于控制属性访问。
分类:
- 数据描述符:实现了
__get__和__set__(或__delete__) - 非数据描述符:只实现了
__get__
class ValidatedAttribute:
def __init__(self, validator):
self.validator = validator
def __get__(self, obj, objtype=None):
if obj is None:
return self
return obj.__dict__.get(self.name)
def __set__(self, obj, value):
self.validator(value)
obj.__dict__[self.name] = value
def __set_name__(self, owner, name):
self.name = f'_{name}'
@property、@classmethod、@staticmethod 底层都是描述符。