2013-03-19 164 views
11
import inspect 

class Foo(object): 
    pass 

if __name__ == '__main__': 
    print type(Foo.__init__) 
    print inspect.getsourcelines(Foo.__init__) 

輸出:什麼是wrapper_descriptor,在這種情況下爲什麼是Foo .__ init __()?

<type 'wrapper_descriptor'> 
Traceback (most recent call last): 
    *snip* 
    File "/usr/lib/python2.7/inspect.py", line 420, in getfile 
    'function, traceback, frame, or code object'.format(object)) 
TypeError: <slot wrapper '__init__' of 'object' objects> is not a module, class, method, function, traceback, frame, or code object 

谷歌搜索提供了究竟,一個wrapper_descriptor是什麼,很少有用的信息,爲什麼一個空類有一個__init__方法不是方法,而是wrapper_descriptor。

這裏究竟發生了什麼?沒有__init__方法的所有課程都有這些wrapper_descriptor的東西之一嗎?爲什麼在班級字典中有__init__

回答

6

你碰到的是一個實現細節。這對於在C中實現的類非常典型,因爲object是。它不是一個Python方法,它是一個C方法,包裝器是這個接口的一部分。

爲什麼在dict類中有__init__

這不是在類字典中,它在object字典中。 object有一個__init__,因此當您嘗試使用super()調用您的類的基類「__init__」方法時,它不會失敗。

+0

如果您在意,C API文檔將解釋除此之外的一些細節。但通常你並不關心「插槽包裝器」,「方法包裝器」等類似的東西,你可以調用它們,就好像它們是綁定方法,未綁定方法等一樣,但是沒有任何Python源代碼。 – abarnert 2013-03-19 23:38:32

相關問題