2011-10-02 17 views
15

A:Python: super e __init __() vs __init __ (self)

super(BasicElement, self).__init__() 

B:

super(BasicElement, self).__init__(self) 

Qual è la differenza tra A e B? La maggior parte degli esempi che uso attraverso A, ma sto correndo in un problema in cui A non chiama la funzione __init__ genitore, ma B lo è. Perché potrebbe essere? Quale dovrebbe essere usato e in quali casi?

+1

mostrano il codice in cui 'funziona B'. Cosa intendi con "A" non sta chiamando "? Hai un errore? Che succede? 'A .__ init__' accetta un parametro diverso da' self'? – agf

risposta

23

Non è necessario eseguire questa seconda forma, a meno che in qualche modo la classe 01Edella classe BasicElement abbia un argomento.

class A(object): 
    def __init__(self): 
     print "Inside class A init" 

class B(A): 
    def __init__(self): 
     super(B, self).__init__() 
     print "Inside class B init" 

>>> b = B() 
Inside class A init 
Inside class B init 

O con le classi che hanno bisogno di argomenti di init:

class A(object): 
    def __init__(self, arg): 
     print "Inside class A init. arg =", arg 

class B(A): 
    def __init__(self): 
     super(B, self).__init__("foo") 
     print "Inside class B init" 

>>> b = B() 
Inside class A init. arg = foo 
Inside class B init  
+5

Importante su questa costruzione è che la super classe A deve essere esplicitamente derivata dall'oggetto. Solo dichiarando 'classe A:' si solleverà l'eccezione 'TypeError: deve essere type, non classobj' quando viene invocata la chiamata super init. – parvus

+0

La classe A deve derivare dall'oggetto !!!! La classe A deve derivare dall'oggetto !!!! La classe A deve derivare dall'oggetto !!!! Ripeti per tre volte per preavviso. – bourneli

Problemi correlati