Python 描述符与 ORM:从查找规则到实战
在 Python 里,属性访问看着简单,背后其实有一套挺细的规则。property 能解决单个字段的校验和封装,但一旦字段多起来,重复代码就会很快堆出来。描述符就是用来收口这类逻辑的:把获取、赋值、删除的规则放到一个对象里,字段只负责挂上去。
为什么 property 不够用
property 很适合做少量属性控制,比如给 age 加一个类型检查:
class User:
@property
def age(self):
return self._age
@age.setter
def age(self, value):
if not isinstance(value, int):
raise ValueError("int value need")
self._age = value
这个写法没问题,但字段一多就不太舒服。比如一个模型里有 name、email、mobile、age、id,其中一半都要做类似校验。继续堆 property,代码会变得很散,后面改规则也容易漏。
描述符更适合这种场景。它不是更'高级',只是更适合重复出现的字段规则。
描述符是什么
只要一个类实现了 __get__、__set__、__delete__ 这三个方法里的任意一个,它就可以作为描述符使用。最常见的是实现 __get__ 和 __set__,把字段读取和赋值逻辑统一起来。
先看一个整数校验的例子:
import numbers
class IntField:
# 实现__set__方法,完成类型校验
def __set__(self, instance, value):
# 校验是否为整数类型
if not isinstance(value, numbers.Integral):
ValueError()
value < :
ValueError()
.value = value
():
.value


