今天我们来看一看,python魔法中的描述器类。
开胃小菜
什么时描述器类?正统才是王道,看看官方怎么解释的
Definition and Introduction
In general, a descriptor is an object attribute with “binding behavior”, one whose attribute access has been overridden by methods in the descriptor protocol. Those methods are get(), set(), and delete(). If any of those methods are defined for an object, it is said to be a descriptor.
大概就时说一个类包含_get__, set, __delete__这几个方法中的一个,然后,绑定对象的属性通过这几个函数中的一个来get, set。然后这个类就被成为描述器类。
主菜来了
实现类型检查的一个描述器类
class String:
def __init__(self, name):
self.name = name
def __set__(self, instance, value):
if not isinstance(value, str):
raise TypeError("Expect type str")
print("Set the name", self.name)
instance.__dict__[self.name] = value
def __get__(self, instance, owner):
return instance.__dict__[self.name]
class Person:
name = String("name")
def __init__(self, name):
self.name = name
if __name__ == "__main__":
a = Person("Wang")
print(a.name)
这里Person类的属性name,的set和get都是通过String这个描述器类控制。
最后的咖啡
描述器能做的不止这些,后续就有待大家去探索了。