描述符协议:构建类型安全的属性验证器
深入探索 Python 描述符协议,学习如何通过 __get__、__set__ 和 __delete__ 创建可复用的属性验证器,实现类似 Django ORM 字段的自动类型检查。 · 难度:入门 · +10XP
描述符协议:构建类型安全的属性验证器
描述符是 Python 中控制属性访问的底层机制。本教程将带你超越常见教程中的 property 装饰器,直接实现描述符类。你将学习如何设计一个通用的类型验证描述符,它可以在类实例赋值时自动检查类型,并抛出有意义的错误信息。通过理解描述符的优先级规则和数据描述符与非数据描述符的区别,你能够编写出更高阶的框架级代码。
class TypedField:
def __set_name__(self, owner, name):
self.name = name
self.type_ = None
def __get__(self, obj, objtype=None):
if obj is None:
return self
return obj.__dict__.get(self.name)
def __set__(self, obj, value):
if not isinstance(value, self.type_):
raise TypeError(f'{self.name} 必须是 {self.type_.__name__} 类型')
obj.__dict__[self.name] = value
class StringField(TypedField):
def __init__(self, maxlen=255):
self.maxlen = maxlen
def __set__(self, obj, value):
if not isinstance(value, str):
raise TypeError('字段必须是字符串')
if len(value) > self.maxlen:
raise ValueError(f'字符串长度不能超过 {self.maxlen}')
obj.__dict__[self.name] = value