描述器
這是Python一個(gè)重要的概念,英文名:Descriptor
descriptor是對(duì)象的一個(gè)屬性,只不過(guò)它存在于類的dict中并且有特殊方法get(可能還有set和__delete)而具有一點(diǎn)特別的功能惋砂,為了方便指代這樣的屬性碾篡,我們給它起了個(gè)名字叫
descriptor屬性
雖然如此浪南,還是看起來(lái)很難理解
標(biāo)準(zhǔn)的描述器對(duì)象定義如下:
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)
普通對(duì)象解取、描述器作為類屬性存谎、描述器對(duì)象作為類實(shí)例屬性
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)
# 說(shuō)明描述器對(duì)象必須是類的屬性银萍,不能是實(shí)例的屬性
f.dd.value = 20
print(f.dd.value)
# 普通對(duì)象的訪問(wèn)
f.n.value = 30
print(f.n.value)
# 無(wú)法通過(guò).直接訪問(wèn)描述器對(duì)象的屬性
print(f.d.value)
運(yùn)行結(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ù)理解類作為裝飾器贰锁。
- 描述器對(duì)象是類的屬性才可以使用get
- 描述器對(duì)實(shí)例的賦值和取值都是通過(guò)get和set進(jìn)行赃梧,此時(shí)類退化為
Data Descriptor
滤蝠,也可以理解為這個(gè)類只是對(duì)一個(gè)數(shù)據(jù)進(jìn)行描述。