multiple method herence __init__ python oop python-3.x super

method - super() python



Uso de Python 3 super() (2)

Una nota rápida, el nuevo uso de super se describe en PEP3135 New Super que se implementó en python 3.0. De particular relevancia;

super().foo(1, 2)

para reemplazar lo viejo:

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

Me pregunto cuándo usar qué sabor de 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)

Hasta ahora he usado super() solo sin argumentos y funcionó como esperaba (por un desarrollador de Java).

Preguntas:

  • ¿Qué significa "ligado" en este contexto?
  • ¿Cuál es la diferencia entre super objeto unido y no ligado?
  • ¿Cuándo usar super(type, obj) y super(type, type2) ?
  • ¿Sería mejor nombrar a la superclase como en Mother.__init__(...) ?

Usemos las siguientes clases para la demostración:

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

El super no enlazado no distribuye el acceso de atributo a la clase, debe usar el protocolo de descriptor:

>>> 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 objeto vinculado a instancia da métodos vinculados:

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

super objeto unido a la clase da función (métodos independientes en términos de 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

Consulte la serie de publicaciones de blog "Cosas que debe saber sobre Python Super" de Michele Simionato ( 1 , 2 , 3 ) para obtener más información