2013-03-19 3 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 

Googling дает очень мало полезной информации о том, что, собственно, wrapper_descriptor, и почему пустой класс имеет __init__ метод, а не метод, а скорее wrapper_descriptor.

Что именно происходит здесь? У всех классов без __init__ методов есть одна из этих вещей wrapper_descriptor? Почему в классе dict вообще есть __init__?

ответ

6

В чем вы столкнулись - это деталь реализации. Это довольно типично для классов, реализованных на C, поскольку object есть. Это не метод Python, это метод C, и оболочка является частью этого интерфейса.

Почему в классе dict вообще нет __init__?

Это не в классе dict, это в разряде object. object имеет __init__, так что, когда вы пытаетесь вызвать базовые классы вашего класса '__init__ методами с использованием super(), это не подводит.

+0

Документация C API объясняет некоторые детали, помимо этого, если вам все равно. Но обычно вам все равно, что «обертка слотов», «метод-обертка» и т. Д. - это то, что вы можете назвать так, как если бы они были связанными методами, несвязанными методами и т. Д., Но не имеют никакого Python исходный код. – abarnert