Descriptor描述器
python中的descriptor表示一类对象,如果定义了 __getters__(), __setters__(), __delete__()的任意一个对象则可称之为descriptor, 基本上就是实现了一个对象的储存系统
三种实现descriptor protocal的方式
1. 自定义Descriptor class
类似django Model -> Field的写法,Model的每个字段为一个Descriptor的实例化,Descriptor则为Field
class Descriptor(object):
def __init__(self, value=""):
self.value = value
# 注意这里的value只是实现了一个储存器
# 在获取和修改时对self(当前对象)的属性进行操作
def __get__(self, obj, objtype):
"""在此例中
self为实例化描述符的本身即Descriptor()
obj为描述符所属的对象, MyClass()——实例化的MyClass对象
objtype则时MyClass——对象的class
"""
return "{}for{}".format(self.value, self.value)
def __set__(self, obj, value):
if isinstance(value, str):
self.value = value
else:
raise TypeError("Name should be string")
class MyClass(object):
name = Descriptor()
notes = Descriptor()
>>> obj = MyClass()
>>> print(obj.name)
for
>>> obj.notes = "test"
>>> print(obj.notes)
testfortest
2. 使用property函数