成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Python (類)實例方法的特殊屬性

shiina / 2103人閱讀

摘要:類實例方法,本身也是這與實例方法一致只不過,一個是綁定類類實例,另一個是綁定實例。

自定義函數(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__)
# 
print(a.foo)
# >
實例方法的首位參數(shù)為實例本身

實例方法執(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 methodclass 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

相關(guān)文章

  • Python學(xué)習(xí)之路28-符合Python風(fēng)格對象

    摘要:本篇繼續(xù)學(xué)習(xí)之路,實現(xiàn)更多的特殊方法以讓自定義類的行為跟真正的對象一樣。之所以要讓向量不可變,是因為我們在計算向量的哈希值時需要用到和的哈希值,如果這兩個值可變,那向量的哈希值就能隨時變化,這將不是一個可散列的對象。 《流暢的Python》筆記。本篇是面向?qū)ο髴T用方法的第二篇。前一篇講的是內(nèi)置對象的結(jié)構(gòu)和行為,本篇則是自定義對象。本篇繼續(xù)Python學(xué)習(xí)之路20,實現(xiàn)更多的特殊方法以讓...

    Eric 評論0 收藏0
  • Python標準庫---16、內(nèi)置型:上下文管理器型、其他、特殊屬性

    摘要:退出運行時上下文并返回一個布爾值旗標來表明所發(fā)生的任何異常是否應(yīng)當(dāng)被屏蔽。除了實現(xiàn)上下文管理協(xié)議以外,不同類型不會被特殊處理。其中一些并不會被內(nèi)置函數(shù)所列出。 上一篇文章:Python標準庫---15、內(nèi)置類型:集合類型、映射類型下一篇文章:Python標準庫---17、內(nèi)置異常 上下文管理器類型 Python 的 with 語句支持通過上下文管理器所定義的運行時上下文這一概念。 此...

    zhisheng 評論0 收藏0
  • Python動態(tài)屬性和特性

    摘要:一利用動態(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...

    scola666 評論0 收藏0
  • SICP Python 描述 2.6 實現(xiàn)和對象

    摘要:以這種方式實現(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)程序...

    chenjiang3 評論0 收藏0
  • python基礎(chǔ)教程:

    摘要:類對象被創(chuàng)建時存在于類命名空間內(nèi)的所有名稱都是有效的屬性名稱。類的實例化,是使用函數(shù)表示法,可以把類對象看做是會返回一個新的類實例的函數(shù)。這就是可變對象作為類變量時的特性。類變量是所有類的實例共享的屬性和方法,實例變量是每個實例獨有的數(shù)據(jù)。 Python是面向?qū)ο蟮母呒壘幊陶Z言,在Python里面一切都是對象:數(shù)字、字符串、元組、列表、字典、集合等內(nèi)置數(shù)據(jù)類型,以及函數(shù)、方法、類、模塊...

    fish 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<