摘要:這里設(shè)置的是實(shí)例屬性實(shí)例屬性會(huì)覆蓋描述符的方法類的描述符依然存在刪除實(shí)例屬性再讀取時(shí)就會(huì)出發(fā)描述符的方法
描述符:描述符類的實(shí)例是托管類的類屬性
用于研究描述符行為的幾個(gè)方法:
def cls_name(obj_or_cls): cls = type(obj_or_cls) if cls is type: cls = obj_or_cls return cls.__name__.split(".")[-1] def display(obj): cls =type(obj) if cls is type: return "".format(obj.__name__) elif cls in [type(None), int]: return repr(obj) else: return "<{} object>".format(cls_name(obj)) def print_args(name, *args): persudo_args = ",".join(display(x) for x in args) print("-> {}.__{}__({}))".format(cls_name(args[0]), name, persudo_args)) class Overriding: """由get 和set 方法的數(shù)據(jù)描述符,也稱覆蓋型描述符""" def __get__(self, instance, owner): print_args("get", self, instance, owner) def __set__(self, instance, value): print_args("set", self, instance, value) class OverridingNoGet: """沒有g(shù)et方法的數(shù)據(jù)描述符,也稱覆蓋型描述符""" def __set__(self, instance, value): print_args("set", self, instance, vvalue) class NonOverriding: """沒有set方法的非數(shù)據(jù)描述符,也稱非覆蓋型描述符""" def __get__(self, instance, owner): print_args("get", self, instance, owner) class Managed: over = Overriding() over_no_get = OverridingNoGet() non_over = NonOverriding() def spam(self): print("-> Managed.spam({})".format(display(self)))
覆蓋型描述符,也叫數(shù)據(jù)型描述符
>>> from demo import * >>> m = Manged() >>> m.over #get里的參數(shù)分別對(duì)應(yīng)[self]Overriding實(shí)例, [instance]Managed實(shí)例,[owner]Managed類 -> Overriding.__get__(, , )) >>> Managed.over #類直接調(diào)用屬性,instance的位置為None。 -> Overriding.__get__( ,None, )) >>> m.over = 7 #[self]->Overriding的實(shí)例, [instance]->Managed類的實(shí)例,[value]->設(shè)置的值[7] -> Overriding.__set__( , ,7)) >>> m.over #讀取m.over, 還是出發(fā)__get__方法 -> Overriding.__get__( , , )) >>> m.__dict__["over"] = 8 #直接通過(guò)__dict__方法設(shè)置實(shí)例屬性 >>> vars(m) #__dict__屬性中已經(jīng)有了over屬性 {"over": 8} >>> m.over #但是,實(shí)現(xiàn)了set方法的覆蓋型描述符會(huì)跳過(guò)實(shí)例屬性,直接讀取描述符屬性 -> Overriding.__get__( , , ))
沒有g(shù)et方法的覆蓋型描述符
>>> m.over_no_get #沒有__get__方法,所以返回描述符實(shí)例>>> Managed.over_no_get #直接從托管類Managed中讀取描述符實(shí)例也是如此 >>> m.over_no_get = 7 #設(shè)置值時(shí)出發(fā)__set__方法 -> OverridingNoGet.__set__( , ,7)) >>> m.__dict__["over_no_get"] = 7 #通過(guò)實(shí)例的__dict__屬性設(shè)置名為over_no_get的實(shí)例屬性 >>> m.over_no_get #現(xiàn)在,實(shí)例屬性會(huì)覆蓋描述符,因?yàn)闆]有定義__get__方法 7 >>> m.over_no_get = 7 #設(shè)置屬性值時(shí)還是會(huì)觸發(fā)描述符的__set__方法 -> OverridingNoGet.__set__( , ,7))
非覆蓋型描述符,也叫非數(shù)據(jù)描述符
>>> m.non_over #出發(fā)描述符的__get__方法 -> NonOverriding.__get__(, , )) >>> m.non_over = 7 #沒有__set__方法,所以沒有干涉賦值操作。這里設(shè)置的是實(shí)例屬性 >>> m.non_over #實(shí)例屬性會(huì)覆蓋描述符的__get__方法 7 >>> m.__dict__ {"non_over": 7} >>> Managed.non_over #類的描述符依然存在 -> NonOverriding.__get__( ,None, )) >>> del m.non_over #刪除實(shí)例屬性 >>> m.__dict__ {} >>> m.non_over #再讀取m.non_over時(shí)就會(huì)出發(fā)描述符的__get__方法 -> NonOverriding.__get__( , , ))
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/43849.html
摘要:最近在閱讀微型框架的源碼,發(fā)現(xiàn)了中有一個(gè)既是裝飾器類又是描述符的有趣實(shí)現(xiàn)。所以第三版的代碼可以這樣寫第三版的代碼沒有使用裝飾器,而是使用了描述符這個(gè)技巧。更大的問題來(lái)自如何將描述符與裝飾器結(jié)合起來(lái),因?yàn)槭且粋€(gè)類而不是方法。 最近在閱讀Python微型Web框架Bottle的源碼,發(fā)現(xiàn)了Bottle中有一個(gè)既是裝飾器類又是描述符的有趣實(shí)現(xiàn)。剛好這兩個(gè)點(diǎn)是Python比較的難理解,又混合在...
摘要:下面我們用描述符來(lái)實(shí)現(xiàn)中的動(dòng)態(tài)屬性和特性中提及的訂單結(jié)算代碼第四版使用描述符實(shí)現(xiàn)訂單結(jié)算功能描述符基于協(xié)議實(shí)現(xiàn),無(wú)需創(chuàng)建子類。特性是覆蓋型描述符。非覆蓋型描述符沒有實(shí)現(xiàn)方法的描述符屬于非覆蓋型描述符。類中定義的方法是非覆蓋型描述符。 導(dǎo)語(yǔ):本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之元編程篇的重點(diǎn)知識(shí)及個(gè)人心得,打算入門Python的朋友們可以來(lái)一起學(xué)習(xí)并交流。 本文重點(diǎn): 1、了解描述符...
摘要:之所以是這樣是因?yàn)楫?dāng)訪問一個(gè)實(shí)例描述符對(duì)象時(shí),會(huì)將轉(zhuǎn)換為。而類的字典中則有描述符對(duì)象。這主要就是因?yàn)槊枋龇麅?yōu)先。此外,非數(shù)據(jù)描述符的優(yōu)先級(jí)低于實(shí)例屬性。參考以上就是本人對(duì)描述符的一些理解,有什么不正確的地方還請(qǐng)不吝指出,謝謝 什么是描述符 python描述符是一個(gè)綁定行為的對(duì)象屬性,在描述符協(xié)議中,它可以通過(guò)方法重寫屬性的訪問。這些方法有 __get__(), __set__(), 和...
摘要:由上面的注釋,可以看出其實(shí)就相當(dāng)于一個(gè)描述符類,而在此刻變成了一個(gè)描述符。調(diào)用這個(gè)方法可以知道,每調(diào)用一次,它都會(huì)經(jīng)過(guò)描述符類的?;诿枋龇绾螌?shí)現(xiàn)同樣的也是一樣。我想你應(yīng)該對(duì)描述符在中的應(yīng)用有了更深的理解。好吧,我承認(rèn)我標(biāo)題黨了。但是這篇文章的知識(shí)點(diǎn),你有極大的可能并不知道。 前段時(shí)間,我寫了一篇描述符的入門級(jí)文章,從那些文章里你知道了如何定義描述符,且明白了描述符是如何工作的。 如果你還...
閱讀 1618·2021-11-17 09:33
閱讀 1328·2021-10-11 10:59
閱讀 2970·2021-09-30 09:48
閱讀 1972·2021-09-30 09:47
閱讀 3095·2019-08-30 15:55
閱讀 2397·2019-08-30 15:54
閱讀 1549·2019-08-29 15:25
閱讀 1709·2019-08-29 10:57