2010-05-05 7 views
20

Ich frage mich, wann zu welcher Geschmack von Python 3 super() verwenden.Verwendung von 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) 

Bis jetzt habe ich nur super() ohne Argumente verwendet und es funktionierte wie (von einem Java-Entwickler) erwartet.

Fragen:

  • Was in diesem Zusammenhang bedeutet "gebunden"?
  • Was ist der Unterschied zwischen gebundenen und ungebundenen Super-Objekt?
  • Wann verwenden Sie super(type, obj) und wenn super(type, type2)?
  • Wäre es besser, die Superklasse wie in Mother.__init__(...) zu benennen?

Antwort

17

Lassen Sie uns die folgenden Klassen zur Demonstration verwenden:

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

class B(A): pass 

Unbound super Objekt nicht Attribut Zugriff auf Klasse nicht versenden, haben Sie Descriptor-Protokoll verwenden:

>>> 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 Objekt gebunden zu Instanz gibt gebundene Methoden:

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

super Objekt Klasse gebunden gibt Funktion (ungebundene Methoden in Bezug auf 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 des "Dinge über Python Super-to Know" Blog-Posts Serie (1, 2, 3) für mehr Informationen

+0

Die Frage speziell über Python3 ist, sondern Blog-Posts-Serie Simionato sind über Python2 und erwähnen, dass * Der Vorteil ist, dass Sie den Namen des wiederholen vermeiden Klasse in der aufrufenden Syntax, da dieser Name im Mangelmechanismus von privaten Namen versteckt ist. Das ist in Python3 nicht mehr so, also ist zumindest dieser eine Vorteil veraltet. – gerrit

7

Eine kurze Anmerkung, die neue Verwendung von super ist in PEP3135 New Super beschrieben, die in Python 3.0 implementiert wurde. Von besonderer Relevanz;

super().foo(1, 2) 

die alte zu ersetzen:

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