下面是 Python 3.x language reference 中的一段话,大意是理解的,不过写不出一个这样的示例,求大神给个与这段话一致的示例:
When an instance method object is derived from a class method object, the “class instance” stored in self will actually be the class itself, so that calling either x.f(1) or C.f(1) is equivalent to calling f(C,1) where f is the underlying function.
其實這個部分,你自己做做實驗就會明白。
我們從原文開始看起,分成兩段來討論,第一段說道:
原文第一段說,當一個
instance method object
被調用時,__func__
的第一個參數先代入class instance
後被調用,接著舉了一個例子:我們用下面的範例來說明,在這裡我們有一個類
Demo
,他底下有一個 functionfoo
和 functionbar
。Demo
類:實際上呢:
Python 對於
foo
,會產生一個 一般的 function,這個 function 會被Demo.foo
所參考。當我們寫出
demo.foo
的時候,Python 會即時創造一個 bound method object:demo.foo
,這個 method object 是個綁定的 method,綁定甚麼呢? 當然就是綁定demo
這個 instance,所以demo.foo.__self__
會參考到demo
, 同時 Python 也會把Demo.foo
記在demo.foo.__func__
中。所以當這個
demo.foo
被呼叫的時候(demo.foo(1,2,3)
),他其實會去呼叫demo.foo.__func__
,並且以demo.foo.__self__
(其實也就是demo
自己) 當作第一個參數。以我們寫的類來展示的話,他的例子變成:
看看代碼:
測試結果:
接著看第二段:
第二段的大意是說,當 instance method object 是來自於 class method object 的時候,存在
self
裡的 類實例 會是 類 本身,之後又舉了一個例子:我們一樣用範例來說明:
Python 對於 bar, 會產生
Demo.bar
,他是一個來自於 class method object 的 bound method object,原本Demo.bar
就跟Demo.foo
一樣是個一般的 Python function,但是透過修飾器(@classmethod
修飾器),他成為了一個 bound method object,若要觀察原本的 general function,只能在Demo.bar.__func__
中看到,同時他綁定了Demo
類,所以Demo.bar.__self__
會參考到Demo
類。所以當
Demo.bar
被呼叫的時候(Demo.bar(1)
),,他其實會去呼叫Demo.bar.__func__
,並且以Demo.bar.__self__
(其實也就是Demo
自己) 當作第一個參數。以我們寫的類來展示的話,他的例子變成:
測試代碼:
測試結果:
結論:
在 Python3 中,class 內有兩種 funciton,一種是一般的 function object,另外一種是 bound method object
instance method 是一般的 function 綁定了 instance 所構成的 method object,class mehtod 是一般的 function 綁定了 class 所構成的 method object
bound method 被調用的時候,其實都是調用最原始的 function (記在
__func__
中),但會以綁定的對象作為第一個參數(記在__self__
中)。參考資料:
Difference between methods and functions
Different way to create an instance method object in Python