2010-05-05 21 views
20

Mi chiedo quando utilizzare il sapore di Python 3 super().Utilizzo di Python 3 super()

Help on class super in module builtins: 

class super(object) 
| super() -> same as super(__class__, <first argument>) 
| super(type) -> unbound super object 
| super(type, obj) -> bound super object; requires isinstance(obj, type) 
| super(type, type2) -> bound super object; requires issubclass(type2, type) 

Fino ad ora ho usato super() solo senza argomenti e ha funzionato come previsto (da uno sviluppatore Java).

Domande:

  • Che cosa significa "legato" significa in questo contesto?
  • Qual è la differenza tra oggetto super associato e non associato?
  • Quando utilizzare super(type, obj) e quando super(type, type2)?
  • Sarebbe meglio nominare la super classe come in Mother.__init__(...)?

risposta

17

Usiamo le seguenti classi per la dimostrazione:

class A(object): 
    def m(self): 
     print('m') 

class B(A): pass 

Unbound super oggetto non invia l'accesso attributo di classe, è necessario utilizzare il protocollo descrittore:

>>> super(B).m 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'super' object has no attribute 'm' 
>>> super(B).__get__(B(), B) 
<super: <class 'B'>, <B object>> 

super oggetto associato ad esempio fornisce metodi associati:

>>> super(B, B()).m 
<bound method B.m of <__main__.B object at 0xb765dacc>> 
>>> super(B, B()).m() 
m 

super oggetto associato alla classe dà la funzione (metodi non legato in termini di Python 2):

>>> super(B, B).m 
<function m at 0xb761482c> 
>>> super(B, B).m() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: m() takes exactly 1 positional argument (0 given) 
>>> super(B, B).m(B()) 
m 

See Michele Simionato di "Cose da sapere su Python Super" i post sul blog della serie (1, 2, 3) per più informazioni

+0

La domanda è specificamente python3, ma post del blog serie di Simionato sono circa python2, e ricordare che * Il vantaggio è che si evita di ripetere il nome del classe nella sintassi chiamante, dal momento che quel nome è nascosto nel meccanismo di mangling dei nomi privati. *. Questo non è più vero in Python3, quindi almeno un vantaggio è datato. – gerrit

7

Una nota rapida, il nuovo utilizzo di super è delineato in PEP3135 New Super implementato in python 3.0. Di particolare rilevanza;

super().foo(1, 2) 

per sostituire il vecchio:

super(Foo, self).foo(1, 2)