成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

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

shiina / 2149人閱讀

摘要:類實(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__)
# 
print(a.foo)
# >
實(shí)例方法的首位參數(shù)為實(shí)例本身

實(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 methodclass 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

相關(guān)文章

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

    摘要:本篇繼續(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)更多的特殊方法以讓...

    Eric 評(píng)論0 收藏0
  • Python標(biāo)準(zhǔn)庫(kù)---16、內(nèi)置型:上下文管理器型、其他、特殊屬性

    摘要:退出運(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í)上下文這一概念。 此...

    zhisheng 評(píng)論0 收藏0
  • Python動(dòng)態(tài)屬性和特性

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

    scola666 評(píng)論0 收藏0
  • SICP Python 描述 2.6 實(shí)現(xiàn)和對(duì)象

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

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

    摘要:類對(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ù)、方法、類、模塊...

    fish 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<