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