继承验证类的流畅实现方案问询:Python对象赋值验证优化
优化实现方案
你现在用多重继承叠加校验规则的写法虽然能实现需求,但继承链过长时MRO排查难度高,而且每加一种校验组合就要定义新的子类,复用性较差,这里提供两种更流畅的实现思路:
方案1:参数化描述符替换多重继承
把所有校验规则收敛到同一个描述符类中,通过初始化参数灵活配置不同的校验逻辑,不需要维护复杂的继承层级,还能解决你原有实现中描述符硬编码_id属性名、无法复用在多个属性上的问题:
class ValidatedField: def __init__(self, expected_type, allow_negative=True, max_value=None, field_remark=None): self.expected_type = expected_type self.allow_negative = allow_negative self.max_value = max_value self.field_remark = field_remark def __set_name__(self, owner, name): # 自动绑定属性名生成私有存储字段,避免多个属性共用描述符时冲突 self.private_attr = f"_{name}" def __get__(self, obj, objtype=None): return getattr(obj, self.private_attr) def __set__(self, obj, value): # 类型校验 assert isinstance(value, self.expected_type), 'Incorrect type' # 非负校验 if not self.allow_negative: assert value >= 0, 'Positive Values Only Accepted' # 最大值校验 if self.max_value is not None: assert value <= self.max_value, f'{value} is too High' setattr(obj, self.private_attr, value) # 业务类直接配置参数即可,不需要额外定义继承类 class MyBusinessClass: # 对应你需求中的8位无符号正整数分类 id = ValidatedField( expected_type=int, allow_negative=False, max_value=2**8 - 1, field_remark='Classificaion1, Integer, 8 bit unsigned' )
方案2:用成熟校验库减少重复代码
如果你的场景是数据类校验,不需要自己手动实现描述符逻辑,直接用pydantic这类成熟的校验框架,几行代码就能实现相同的效果,还自带类型转换、序列化、错误提示等额外能力:
from pydantic import BaseModel, Field class MyBusinessModel(BaseModel): id: int = Field( ge=0, le=2**8 - 1, description='Classificaion1, Integer, 8 bit unsigned' )
内容的提问来源于stack exchange,提问作者Pepe
相关产品推荐
相关产品推荐

