¿Puedo usar la sintaxis limpia de Python 3 super()
en Python 2.5.6?
¿Tal vez con algún tipo de importación __future__
?¿Puedo usar Python 3 super() en Python 2.5.6?
Respuesta
No puede usar una llamada super()
que no contiene ningún tipo/clase. Tampoco puedes implementar un reemplazo que funcione. 3.x Python contiene un apoyo especial para permitir al descubierto super()
llamadas (se coloca una variable __class__
celular en todas las funciones definidas dentro de una clase - ver PEP 3135
No, no puedes. Pero puede usar Python 2 super()
en Python 3.
Nota Esta es una "solución" terrible, lo pongo sólo para ! asegúrese de que no hacer esto en casa
repito: no hacen esto
Uno puede pensar en usar este mixin
class Super(object):
def super(self):
return super(self.__class__, self)
para obtener una self.super()
:
class A(object, Super):
def __init__(self):
print "A"
class B(A):
def __init__(self):
print "B"
self.super().__init__()
obteniéndose:
>>> a = A()
A
>>> b = B()
B
A
Pero cuidado: Este self.super()
no es equivalente a super(B, self)
- si A
también llamado self.super().__init__()
, la construcción de un B
causaría el constructor A
para llamarse a sí mismo indefinidamente, ya que self.__class__
se mantendrá B
. Esto se debe a la falta del __class__
mencionado en el accepted answer. Posiblemente pueda solucionar este problema con una máquina de estado oculta o una metaclase sofisticada que p. Ej. verifica la posición real de la clase en self.__class__.mro()
, pero ¿realmente vale la pena? Probablemente no ...
Me doy cuenta de que esta pregunta es antigua, y que la respuesta seleccionada puede haber sido correcta en ese momento, pero ya no está completa. Todavía no se puede utilizar super()
en 2.5.6, pero python-future
proporciona una back-ported implementation para 2.6+:
% pip install future
...
% python
...
>>> import sys
>>> sys.version_info[:3]
(2, 7, 9)
>>> from builtins import *
>>> super
<function newsuper at 0x000000010b4832e0>
>>> super.__module__
'future.builtins.newsuper'
>>> class Foo(object):
... def f(self):
... print('foo')
...
>>> class Bar(Foo):
... def f(self):
... super().f() # <- whoomp, there it is
... print('bar')
...
>>> b = Bar()
>>> b.f()
foo
bar
Si utiliza pylint
, puede desactivar las advertencias de legado con el comentario:
# pylint: disable=missing-super-argument
Agradable, gracias :) –
- 1. Uso de Python 3 super()
- 2. Python: ¿Por qué no puedo usar `super` en una clase?
- 3. Python super() plantea TypeError
- 4. Función super() de Python
- 5. Python se extiende con - el uso de super() Python 3 vs Python 2
- 6. Python clase super reflexión
- 7. Python 3 tipos incorporados __init__ no llama a super() .__ init__?
- 8. clase de Python - Super variables
- 9. Python - Virtualenv, python 3?
- 10. ¿Se puede usar Clutter con Python 3?
- 11. Python en OpenOffice 3
- 12. super() en Python 2.x sin argumentos
- 13. Nuevo en Python ... Python 3 y Matplotlib
- 14. python 3 en emacs
- 15. ¿Puedo usar python con giraph?
- 16. Quiero usar NumPy/SciPy. ¿Debería usar Python 2 o 3?
- 17. Python: super y __init __() vs __init __ (self)
- 18. ¿Cómo puedo usar código común en python?
- 19. Python 2 vs. Python 3 - formatos urllib
- 20. Nuevo proyecto: Python 2 o Python 3?
- 21. Python 3 setuptools en mac
- 22. ¿Admite PySide Python 3?
- 23. ¿Cómo usar una función de comparación personalizada en Python 3?
- 24. Python 2 y Python 3 __cmp__
- 25. Proyecto Python 3 en exe?
- 26. argparse falta en python 3
- 27. Leer MP3 en Python 3
- 28. Python 2.7 o Python 3 (por velocidad)?
- 29. Python 3 string.join() equivalente?
- 30. PyGObject en Python 3 en Windows
Gracias. Estaba confundido porque una versión anterior de este PEP decía que lo importaría con 'from __future__ import new_super' que no funciona. –