2013-03-19 2 views
11
import inspect 

class Foo(object): 
    pass 

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

Ausgang:Was ist ein Wrapper_descriptor, und warum ist Foo .__ init __() in diesem Fall?

<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 

googeln gibt sehr wenig nützliche Informationen über, was genau ein wrapper_descriptor ist, und warum eine leere Klasse hat eine __init__ Methode, die keine Methode, sondern vielmehr eine wrapper_descriptor.

Was genau passiert hier? Haben alle Klassen ohne __init__ Methoden einen dieser wrapper_descriptor Dinge? Warum gibt es eine __init__ in der Klasse dict überhaupt?

Antwort

6

Was haben Sie stoßen auf eine Implementierung Detail. Dies ist ziemlich typisch für Klassen in C implementiert, wie object ist. Es ist keine Python-Methode, es ist eine C-Methode und der Wrapper ist Teil dieser Schnittstelle.

Warum gibt es eine __init__ in der Klasse dict überhaupt?

Es ist nicht in der Klasse dict, es ist in der object dict. object hat eine __init__, so dass es nicht fehlschlägt, wenn Sie versuchen, die Klassen __init__ der Klasse Ihrer Klasse unter Verwendung super() aufzurufen.

+0

Die C-API-Dokumentation einige Details darüber hinaus erklärt, wenn Sie sich interessieren. Aber normalerweise ist es dir egal, dass "slot wrapper", "method-wrapper" und ähnliches Dinge sind, die du aufrufen kannst, als wären sie gebundene Methoden, ungebundene Methoden, etc., aber keine Python Quellcode. – abarnert

Verwandte Themen