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

2021-09-19 05:49:55 字數 3061 閱讀 4196

自定義函式的特殊屬性已經專門整理過一篇(python 自定義函式的特殊屬性),方法的特殊屬性與其稍有不同,我們通過下面這個例子展開介紹:

class a():

def foo(self):

'''a method'''

print('hellow world!')

bar = foo

@classmethod

def clsmtd(cls, arg):

print(str(arg))

a = a()

與自定義函式的特殊屬性相比,例項方法具有__self__,__func__這兩個函式所不具有的唯讀屬性;此外,方法的__doc__,__name__,__module__也是唯讀。對於例項方法而言,其__self__屬性為例項本身:

print(a.foo.__self__)

# <__main__.a object at 0x00000233df6de2e8>

print(a)

# <__main__.a object at 0x00000233df6de2e8>

__func__屬性則返回方法所對應的底層函式:

print(a.foo)

# >

print(a.foo.__func__) #注意與 a.foo 的區別

#

至於__doc__,__name__,__module__屬性則與函式相應屬性的值一致,所不同的是方法的這些屬性均為唯讀,不可改寫:

print(a.foo.__doc__)

# a method

print(a.foo.__name__)

# foo

print(a.foo.__module__)

# __main__

不過,例項方法也可以通過其底層的function物件(通過__func__屬性獲得)訪問函式所具有的特殊屬性,如:

print(a.foo.__func__.__code__)

#", line 3>

因此,諸如__doc__,__name__,__module__等屬性的值就可以通過底層函式相應的特殊屬性進行改寫:

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

需要注意的是:當乙個類的例項方法是通過其他例項方法建立,則其他例項方法所對應的底層函式並非其所建立的例項方法,而是其所建立的例項方法所對應的底層函式:

print(a.bar) #注意這裡 a.bar 是個例項方法

>

print(a.bar.__func__)

#

上例中,通過其他例項方法a.bar建立了例項方法a.foo,但a.bar.__func__卻是a.foo.__func__而非a.foo

print(a.foo.__func__)

# print(a.foo)

# >

例項方法執行時,其底層函式的首位引數為例項本身,下面兩行**執行結果是一致的:

a.foo()

# hellow world!

a.foo.__func__(a)

# hellow world!

當乙個例項方法(嚴格來說是類例項方法)是由類方法建立,則其__self__屬性是其類本身:

print(a.clsmtd.__self__)

#

事實上,通過類方法建立的(類)例項方法,在呼叫底層函式時(下例是a.clsmtd.__func__),其首位引數(也即__self__)是類本身,這一點與例項方法執行時有所區別。

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)

#

只不過,乙個是繫結類(類例項),另乙個是繫結例項。

Python類的特殊屬性

定義如下類 class foo object foo class definition 類的特殊屬性都有哪些呢?oo.name 類的名字 oo.doc 類的文件字串 foo.bases 類的所有父類構成的元組 foo.dict 類的屬性 foo.module 類定義所在的模組 foo.class 類...

91 Python 中類的特殊屬性

目錄 特殊屬性 python物件中包含了很多雙下劃線開始和結束的屬性,這些事特殊屬性,有特殊用法 這裡我們列出常見的特殊屬性 特殊方法 含義 obj.dict 物件的屬性字典 obj.class 物件所屬的類 class.bases 類的基類元組 多繼承 class.base 類的基類 class....

Python物件導向特殊屬性及方法解析

更多程式設計教程請到 菜鳥教程 高州陽光論壇 特殊屬性 python中物件包括很多雙下劃線開始和結束的屬性,這些特殊屬性,有特殊用法。特殊方法 含義obj.dict 物件的屬性字典 obj.class 物件所處的類 class.bases 類的基本元組 多繼承 class.base 類的基類 cla...