2013-08-16 50 views
7

的Python 2.6.5(R265:79063,2012年10月1日,22點07分21秒) [4.4.3 GCC]爲什麼在Python 2變化未綁定方法的ID()每次訪問

>>> class myclass: 
...  def func(self): 
...    pass 

>>> dd = myclass.func 
>>> ee = myclass.func 
>>> cc = myclass.func 
>>> ff = myclass.func 
>>> ss = myclass.func 
>>> uu = myclass.func 
>>> pp = myclass.func 
>>> 
>>> 
>>> id(dd) ; id(cc) ; id(ee) ; id(ff) ; id(ss) ; id(uu) ; id(pp) 
3074535252L 
3074534772L 
3074522444L 
3074531732L 
3074497588L 
3073003604L 
3073003724L 

爲什麼每次都有不同的未綁定方法的ID?

它不應該一樣嗎?

+0

新樣式類也會發生嗎? – Tadeck

+0

@Tadeck現在讓我試試。編輯:是的。 – abc

+0

該id()是地址是一個不相關的實現細節。我更新了這個問題來反映這一點。 –

回答

6

這是因爲類(舊的或新的)上的方法的工作方式與描述符__get__方法的屬性非常相似;關於Python 2的代碼

foo = FooClass.bar_method 

類似於

import types 
foo = types.MethodType(FooClass.__dict__['bar_method'], None, FooClass) 

它將在每個接入創造instancemethod(bar_method, None, FooClass)一個新的實例。原始功能可用FooClass.bar_method.im_funcfoo.im_class中的類實例。綁定和未綁定方法的類型相同instancemethod;如果im_self構件是None,所述instancemethod實例具有再版<unbound method ...>,而如果im_self構件不是無,再版是<bound method...>

Python 3中是不同的。未綁定的方法有repr <function x.f at 0x7fd419cf69e0>,id始終相同,即它們只是常規函數。在Python 3中,你可以傳遞任何未綁定的undecorated方法的self,即使是None,它只是一個帶有點名稱的函數。

+0

這不會發生綁定的方法。綁定方法的不同實例都具有相同的函數對象。 – abc

+0

你能用代碼證明嗎?沒有證據(如文件或工作代碼),這只是一個猜測。 – Tadeck

+0

@Tadeck,我試了一下。請繼續前進並嘗試一下。我使用im_func屬性來獲取與不同綁定方法實例關聯的func對象。 – abc

相關問題