Python裝飾器14-描述器

描述器

這是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ù)理解類作為裝飾器。

  1. 描述器對象是類的屬性才可以使用get
  2. 描述器對實例的賦值和取值都是通過getset進(jìn)行,此時類退化為Data Descriptor,也可以理解為這個類只是對一個數(shù)據(jù)進(jìn)行描述。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容