2013-03-19 4 views
11
import inspect 

class Foo(object): 
    pass 

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

uscita:Che cos'è un wrapper_descriptor e perché in questo caso 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 fornisce pochissime informazioni utili su che cosa, esattamente, un wrapper_descriptor è, e perché una classe vuota ha un metodo __init__ che non è un metodo, ma piuttosto un wrapper_descriptor.

Che cosa sta succedendo esattamente qui? Tutte le classi senza i metodi __init__ hanno uno di questi oggetti wrapper_descriptor? Perché c'è un __init__ nella dict di classe?

risposta

6

Quello che hai incontrato è un dettaglio di implementazione. Questo è abbastanza tipico per le classi implementate in C, come lo è object. Non è un metodo Python, è un metodo C e il wrapper fa parte di questa interfaccia.

Perché c'è un __init__ nella classe Dibt a tutti?

Non è nel codice categoria, è nel codice object. object ha un __init__ in modo che quando si tenta di chiamare i metodi __init__ classi base della classe utilizzando super(), non ha esito negativo.

+0

La documentazione dell'API C illustra alcuni dettagli oltre a questo, se ci tenete. Ma normalmente non ti interessa oltre al fatto che "slot wrapper", "method-wrapper" e simili sono cose che puoi chiamare come se fossero metodi associati, metodi non associati, ecc., Ma non hai Python codice sorgente. – abarnert