描述器
這是Python一個重要的概念,英文名:Descriptor
descriptor是對象的一個屬性,只不過它存在于類的dict中并且有特殊方法get(可能還有set和__delete)而具有一點特別的功能,為了方便指代這樣的屬性,我們給它起了個名字叫
descriptor屬性
雖然如此,還是看起來很難理解
標(biāo)準(zhǔn)的描述器對象定義如下:
class Des:
def __init__(self):
self.value = ''
def __get__(self, instance, owner):
print('returned from des obj')
return self.value
def __set__(self, instance, value):
print('set in des obj')
self.value = value
def __delete__(self, instance):
print('delete in des obj')
del self.value
class Foo:
d = Des()
f = Foo()
f.d = 10
print(f.d)
普通對象、描述器作為類屬性、描述器對象作為類實例屬性
class Des:
def __init__(self):
self.value = ''
def __get__(self, instance, owner):
print('returned from des obj')
return self.value
def __set__(self, instance, value):
print('set in des obj')
self.value = value
def __delete__(self, instance):
print('delete in des obj')
del self.value
class Nor:
def __init__(self):
self.value = 10
class Foo:
d = Des()
n = Nor()
def __init__(self):
self.dd = Des()
f = Foo()
f.d = 10
print(f.d)
# 說明描述器對象必須是類的屬性,不能是實例的屬性
f.dd.value = 20
print(f.dd.value)
# 普通對象的訪問
f.n.value = 30
print(f.n.value)
# 無法通過.直接訪問描述器對象的屬性
print(f.d.value)
運行結(jié)果:
set in des obj
returned from des obj
10
20
30
returned from des obj
Traceback (most recent call last):
File "descriptor2.py", line 39, in <module>
print(f.d.value)
AttributeError: 'int' object has no attribute 'value'
小結(jié)
關(guān)于描述器的講解不止于上述內(nèi)容,可以繼續(xù)參考Python的官方文檔,我們只需要記住以上部分內(nèi)容,便于后續(xù)理解類作為裝飾器。
- 描述器對象是類的屬性才可以使用get
- 描述器對實例的賦值和取值都是通過get和set進(jìn)行,此時類退化為
Data Descriptor,也可以理解為這個類只是對一個數(shù)據(jù)進(jìn)行描述。