2013-09-06 16 views
7

Sto imparando a conoscere Python OOP. Nel codice sorgente di qualche framework, ho trovato return super(... e mi chiedevo se ci fosse una differenza tra i due.Qual è la differenza tra `super (...)` e `return super (...)`?

class a(object): 
    def foo(self): 
     print 'a' 

class b(object): 
    def foo(self): 
     print 'b' 

class A(a): 
    def foo(self): 
     super(A, self).foo() 

class B(b): 
    def foo(self): 
     return super(B, self).foo() 

>>> aie = A(); bee = B() 
>>> aie.foo(); bee.foo() 
a 
b 

Sembra uguale a me. So che l'OOP può diventare piuttosto complicato se lo si lascia, ma non ho i mezzi per trovare un esempio più complesso a questo punto del mio apprendimento. C'è una situazione in cui la restituzione di super sarebbe diversa dalla chiamata super?

+4

Qual è la differenza tra '" x "' e 'return" x "'? – user2246674

risposta

12

Sì. Si consideri il caso in cui non solo la stampa, della superclasse foo restituito qualcosa:

class BaseAdder(object): 
    def add(self, a, b): 
     return a + b 

class NonReturningAdder(BaseAdder): 
    def add(self, a, b): 
     super(NonReturningAdder, self).add(a, b) 

class ReturningAdder(BaseAdder): 
    def add(self, a, b): 
     return super(ReturningAdder, self).add(a, b) 

Dati due casi:

>>> a = NonReturningAdder() 
>>> b = ReturningAdder() 

Quando chiamiamo foo su a, apparentemente non succede nulla:

>>> a.add(3, 5) 

Quando chiamiamo foo su b, tuttavia, otteniamo il risultato previsto:

>>> b.add(3, 5) 
8 

Ecco perché, mentre entrambe le NonReturningAdder e ReturningAdderBaseAdder l' appello foo, NonReturningAdder ne scarta il valore di ritorno, mentre ReturningAdder lo passa.

+0

Ohh! Stavo leggendo questo blog che mi dava l'impressione che 'super' fosse una sorta di magia pitone - evocata per risolvere un problema di ereditarietà con il" vecchio stile ". Grazie per aver risposto alla mia stupida domanda. –

+0

@Noob: Sì, 'super' fa un po 'di magia nel determinare esattamente cosa chiamare, ma una volta che chiama quell'altro metodo, agisce esattamente come ci si aspetterebbe. – icktoofay

Problemi correlati