简单描述符
有两种不同类型的描述符。数据描述符被定义为定义 __get__()
和 __set__()
方法的对象,而非数据描述符仅定义 __get__()
方法。在考虑覆盖和实例字典的命名空间时,这种区别很重要。如果数据描述符和实例字典中的条目共享相同的名称,则数据描述符将优先。但是,如果非数据描述符和实例字典中的条目共享相同的名称,则实例字典的条目优先。
为了使只读数据描述符,同时定义得到 ()和设置与() 集 ()调用时引发一个 AttributeError 的。使用异常提升占位符定义 set ()方法足以使其成为数据描述符。
descr.__get__(self, obj, type=None) --> value
descr.__set__(self, obj, value) --> None
descr.__delete__(self, obj) --> None
一个实现的例子:
class DescPrinter(object):
"""A data descriptor that logs activity."""
_val = 7
def __get__(self, obj, objtype=None):
print('Getting ...')
return self._val
def __set__(self, obj, val):
print('Setting', val)
self._val = val
def __delete__(self, obj):
print('Deleting ...')
del self._val
class Foo():
x = DescPrinter()
i = Foo()
i.x
# Getting ...
# 7
i.x = 100
# Setting 100
i.x
# Getting ...
# 100
del i.x
# Deleting ...
i.x
# Getting ...
# 7