簡單描述符
有兩種不同型別的描述符。資料描述符被定義為定義 __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