摘要:類實(shí)例方法,本身也是這與實(shí)例方法一致只不過(guò),一個(gè)是綁定類類實(shí)例,另一個(gè)是綁定實(shí)例。
自定義函數(shù)的特殊屬性已經(jīng)專門整理過(guò)一篇(Python 自定義函數(shù)的特殊屬性),方法的特殊屬性與其稍有不同,我們通過(guò)下面這個(gè)例子展開(kāi)介紹:
class A(): def foo(self): """a method""" print("hellow world!") bar = foo @classmethod def clsmtd(cls, arg): print(str(arg)) a = A()實(shí)例方法的只讀屬性
與自定義函數(shù)的特殊屬性相比,實(shí)例方法具有 __self__,__func__ 這兩個(gè)函數(shù)所不具有的只讀屬性;此外,方法的 __doc__,__name__,__module__ 也是只讀。對(duì)于實(shí)例方法而言,其 __self__ 屬性為實(shí)例本身:
print(a.foo.__self__) # <__main__.A object at 0x00000233DF6DE2E8> print(a) # <__main__.A object at 0x00000233DF6DE2E8>
而 __func__ 屬性則返回方法所對(duì)應(yīng)的底層函數(shù):
print(a.foo) #> print(a.foo.__func__) #注意與 a.foo 的區(qū)別 #
至于 __doc__,__name__,__module__ 屬性則與函數(shù)相應(yīng)屬性的值一致,所不同的是方法的這些屬性均為只讀,不可改寫(xiě):
print(a.foo.__doc__) # a method print(a.foo.__name__) # foo print(a.foo.__module__) # __main__實(shí)例方法可通過(guò)底層函數(shù)訪問(wèn)函數(shù)屬性
不過(guò),實(shí)例方法也可以通過(guò)其底層的 function 對(duì)象(通過(guò) __func__ 屬性獲得)訪問(wèn)函數(shù)所具有的特殊屬性,如:
print(a.foo.__func__.__code__)
# ", line 3>
因此,諸如 __doc__,__name__,__module__等屬性的值就可以通過(guò)底層函數(shù)相應(yīng)的特殊屬性進(jìn)行改寫(xiě):
a.foo.__doc__ = "raise error" # AttributeError: attribute "__doc__" of "method" objects is not writable print(a.foo.__func__.__doc__) # a method a.foo.__func__.__doc__ = "can be changed through func doc" print(a.foo.__doc__) # can be changed through func doc a.foo.__name__ = "dobi" # AttributeError: "method" object has no attribute "__name__" print(a.foo.__func__.__name__) # foo a.foo.__func__.__name__ = "dobi" print(a.foo.__name__) # dobi底層函數(shù)的唯一性
需要注意的是:當(dāng)一個(gè)類的實(shí)例方法是通過(guò)其他實(shí)例方法創(chuàng)建,則其他實(shí)例方法所對(duì)應(yīng)的底層函數(shù)并非其所創(chuàng)建的實(shí)例方法,而是其所創(chuàng)建的實(shí)例方法所對(duì)應(yīng)的底層函數(shù):
print(a.bar) #注意這里 a.bar 是個(gè)實(shí)例方法> print(a.bar.__func__) #
上例中,通過(guò)其他實(shí)例方法 a.bar 創(chuàng)建了實(shí)例方法 a.foo,但a.bar.__func__ 卻是 a.foo.__func__ 而非 a.foo:
print(a.foo.__func__) #實(shí)例方法的首位參數(shù)為實(shí)例本身print(a.foo) # >
實(shí)例方法執(zhí)行時(shí),其底層函數(shù)的首位參數(shù)為實(shí)例本身,下面兩行代碼執(zhí)行結(jié)果是一致的:
a.foo() # hellow world! a.foo.__func__(a) # hellow world!類實(shí)例方法的首位參數(shù)是類本身
當(dāng)一個(gè)實(shí)例方法(嚴(yán)格來(lái)說(shuō)是類實(shí)例方法)是由類方法創(chuàng)建,則其 __self__ 屬性是其類本身:
print(a.clsmtd.__self__) #
事實(shí)上,通過(guò)類方法建立的(類)實(shí)例方法,在調(diào)用底層函數(shù)時(shí)(下例是 A.clsmtd.__func__),其首位參數(shù)(也即 __self__)是類本身,這一點(diǎn)與實(shí)例方法執(zhí)行時(shí)有所區(qū)別。
a.clsmtd("dog") # dog A.clsmtd("dog") # dog A.clsmtd.__func__(A, "dog") # dog
類實(shí)例方法,本身也是 bound method,這與實(shí)例方法一致:
print(a.clsmtd) #> print(a.foo) # > print(A.clsmtd) # > print(A.foo) #
只不過(guò),一個(gè)是綁定類(類實(shí)例),另一個(gè)是綁定實(shí)例。
總結(jié)Python 3 有兩種 bound method, 一種是 instance method,一種是 class method(class instance method),兩種都可以被實(shí)例訪問(wèn);
對(duì)于 instance method 其 __self__ 屬性值為 instance 本身,而 class method 其屬性值則為 class 本身;
不管是 instance method 還是 class method ,執(zhí)行時(shí),都需要調(diào)用與之對(duì)應(yīng)的底層函數(shù)(underlying function,通過(guò) __func__ 訪問(wèn)),底層函數(shù)的首位參數(shù)通過(guò) __self__ 獲得, 對(duì)于 instance method 其為該實(shí)例本身,對(duì)于 class method 則為該類本身;
bound method 可以通過(guò)對(duì)應(yīng)的底層函數(shù),訪問(wèn)函數(shù)的所有特殊屬性。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/38004.html
摘要:本篇繼續(xù)學(xué)習(xí)之路,實(shí)現(xiàn)更多的特殊方法以讓自定義類的行為跟真正的對(duì)象一樣。之所以要讓向量不可變,是因?yàn)槲覀冊(cè)谟?jì)算向量的哈希值時(shí)需要用到和的哈希值,如果這兩個(gè)值可變,那向量的哈希值就能隨時(shí)變化,這將不是一個(gè)可散列的對(duì)象。 《流暢的Python》筆記。本篇是面向?qū)ο髴T用方法的第二篇。前一篇講的是內(nèi)置對(duì)象的結(jié)構(gòu)和行為,本篇?jiǎng)t是自定義對(duì)象。本篇繼續(xù)Python學(xué)習(xí)之路20,實(shí)現(xiàn)更多的特殊方法以讓...
摘要:退出運(yùn)行時(shí)上下文并返回一個(gè)布爾值旗標(biāo)來(lái)表明所發(fā)生的任何異常是否應(yīng)當(dāng)被屏蔽。除了實(shí)現(xiàn)上下文管理協(xié)議以外,不同類型不會(huì)被特殊處理。其中一些并不會(huì)被內(nèi)置函數(shù)所列出。 上一篇文章:Python標(biāo)準(zhǔn)庫(kù)---15、內(nèi)置類型:集合類型、映射類型下一篇文章:Python標(biāo)準(zhǔn)庫(kù)---17、內(nèi)置異常 上下文管理器類型 Python 的 with 語(yǔ)句支持通過(guò)上下文管理器所定義的運(yùn)行時(shí)上下文這一概念。 此...
摘要:一利用動(dòng)態(tài)屬性處理數(shù)據(jù)源屬性在中,數(shù)據(jù)的屬性和處理數(shù)據(jù)的方法統(tǒng)稱屬性。處理無(wú)效屬性名在中,由于關(guān)鍵字被保留,名稱為關(guān)鍵字的屬性是無(wú)效的。內(nèi)置函數(shù)列出對(duì)象的大多數(shù)屬性。點(diǎn)號(hào)和內(nèi)置函數(shù)會(huì)觸發(fā)這個(gè)方法。 導(dǎo)語(yǔ):本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之元編程篇的重點(diǎn)知識(shí)及個(gè)人心得,打算入門Python的朋友們可以來(lái)一起學(xué)習(xí)并交流。 本文重點(diǎn): 1、了解如何利用動(dòng)態(tài)屬性處理數(shù)據(jù);2、掌握Pyth...
摘要:以這種方式實(shí)現(xiàn)對(duì)象系統(tǒng)的目的是展示使用對(duì)象隱喻并不需要特殊的編程語(yǔ)言。我們的實(shí)現(xiàn)并不遵循類型系統(tǒng)的明確規(guī)定。反之,它為實(shí)現(xiàn)對(duì)象隱喻的核心功能而設(shè)計(jì)。是分發(fā)字典,它響應(yīng)消息和。 2.6 實(shí)現(xiàn)類和對(duì)象 來(lái)源:2.6 Implementing Classes and Objects 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 在使用面向?qū)ο缶幊谭妒綍r(shí),我們使用對(duì)象隱喻來(lái)指導(dǎo)程序...
摘要:類對(duì)象被創(chuàng)建時(shí)存在于類命名空間內(nèi)的所有名稱都是有效的屬性名稱。類的實(shí)例化,是使用函數(shù)表示法,可以把類對(duì)象看做是會(huì)返回一個(gè)新的類實(shí)例的函數(shù)。這就是可變對(duì)象作為類變量時(shí)的特性。類變量是所有類的實(shí)例共享的屬性和方法,實(shí)例變量是每個(gè)實(shí)例獨(dú)有的數(shù)據(jù)。 Python是面向?qū)ο蟮母呒?jí)編程語(yǔ)言,在Python里面一切都是對(duì)象:數(shù)字、字符串、元組、列表、字典、集合等內(nèi)置數(shù)據(jù)類型,以及函數(shù)、方法、類、模塊...
閱讀 1575·2021-09-30 09:57
閱讀 1582·2021-09-09 09:33
閱讀 2367·2021-09-04 16:40
閱讀 1923·2021-09-01 10:50
閱讀 3326·2021-09-01 10:31
閱讀 2626·2019-08-30 15:56
閱讀 3043·2019-08-30 15:44
閱讀 3548·2019-08-29 17:29