本篇文章給大家分享的是有關(guān)如何在Python中使用descriptor描述符,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

描述符(descriptor)是實(shí)現(xiàn)了__get__、__set__、__del__方法的類,進(jìn)一步可以細(xì)分為兩類:
數(shù)據(jù)描述符:實(shí)現(xiàn)了__get__和__set__
非數(shù)據(jù)描述符:沒有實(shí)現(xiàn)__set__
描述符在類的屬性調(diào)用中起著很重要的作用,類在調(diào)用屬性時,遵守兩個規(guī)則:
按照實(shí)例屬性、類屬性的順序選擇屬性,即實(shí)例屬性優(yōu)先于類屬性
如果在類屬性中發(fā)現(xiàn)同名的數(shù)據(jù)描述符,那么該描述符會優(yōu)先于實(shí)例屬性
非數(shù)據(jù)描述符會被實(shí)例屬性覆蓋
class A:
def __get__(self, obj, cls):
return f"{obj}: get"
class B:
value = A()
def __init__(self):
self.value = 4
def main():
g = B()
print(g.value)
print(g.__dict__)
if __name__ == "__main__":
main()輸出結(jié)果
4
{'value': 4}
數(shù)據(jù)描述符優(yōu)于實(shí)例屬性
class A:
def __get__(self, obj, cls):
return f"{obj}: get"
def __set__(self, obj, value):
print(f"{obj}: set, {value}")
class B:
value = A()
def __init__(self):
self.value = 4
def main():
g = B()
print(g.value)
print(g.__dict__)
if __name__ == "__main__":
main()輸出結(jié)果
<__main__.B object at 0x000001165EB85898>: set, 4
<__main__.B object at 0x000001165EB85898>: get
{}
從上述兩個例子中可以看到,類B的value屬性是一個描述符,當(dāng)value屬性是一個數(shù)據(jù)描述符時,它屏蔽了實(shí)例的同名屬性value,實(shí)例對value屬性的讀取與賦值都會直接被轉(zhuǎn)移到類屬性value上。
使用描述符實(shí)現(xiàn)類的靜態(tài)方法與類方法
from functools import partial
class Staticmethod:
def __init__(self, method):
self.method = method
def __get__(self, obj, cls):
return self.method
class Classmethod:
def __init__(self, method):
self.method = method
def __get__(self, obj, cls):
return partial(self.method, cls)
class A:
@Staticmethod
def f(self):
print(f"I'm method f, the value is {self}")
@Classmethod
def c(self):
print(f"my class is {self}")
a = A()
a.f(23)
A.f(23)
a.c()
A.c()輸出結(jié)果
I'm method f, the value is 23
I'm method f, the value is 23
my class is <class '__main__.A'>
my class is <class '__main__.A'>
靜態(tài)方法與類方法統(tǒng)一了類屬性的兩種引用方式。這種統(tǒng)一的過程可以使用描述符修改屬性訪問的默認(rèn)方式實(shí)現(xiàn)。靜態(tài)方法限制實(shí)例的默認(rèn)綁定,將方法當(dāng)做普通函數(shù)使用;類方法始終將類作為第一個參數(shù)傳入,上述的partial將類固定為方法的第一個參數(shù)。
總結(jié)
描述符是實(shí)現(xiàn)了__get__、__set__、__del__等特殊方法的類,在屬性訪問時起著很大的作用。
數(shù)據(jù)描述符會覆蓋同名的實(shí)例屬性,通過使用數(shù)據(jù)描述符,達(dá)到通過實(shí)例修改類變量的目的。
描述符用于修改屬性的默認(rèn)訪問方式,借此可以實(shí)現(xiàn)類方法與靜態(tài)方法。
以上就是如何在Python中使用descriptor描述符,小編相信有部分知識點(diǎn)可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
文章名稱:如何在Python中使用descriptor描述符-創(chuàng)新互聯(lián)
分享URL:http://www.chinadenli.net/article42/dgeohc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、外貿(mào)建站、軟件開發(fā)、動態(tài)網(wǎng)站、電子商務(wù)、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容