Posso usare pulito sintassi Python 3 super()
in Python 2.5.6?
Magari con qualche tipo di __future__
importazione?Posso usare Python 3 super() in Python 2.5.6?
risposta
Non è possibile utilizzare una chiamata super()
nuda che non contiene alcun tipo/classe. Né puoi implementare un sostituto che funzioni. Python 3.x contiene il supporto speciale per abilitare nudi super()
chiamate (pone una variabile __class__
cella in tutte le funzioni definite all'interno di una classe - vedere PEP 3135
No non si può. Ma è possibile utilizzare Python 2 super()
in Python 3.
Nota Si tratta di una "soluzione" terribile, ho posto solo per ! assicuratevi di non farlo a casa
ripeto: non fare questo
Uno può pensare di utilizzare questo mixin
class Super(object):
def super(self):
return super(self.__class__, self)
di ottenere un self.super()
:
class A(object, Super):
def __init__(self):
print "A"
class B(A):
def __init__(self):
print "B"
self.super().__init__()
cedevole:
>>> a = A()
A
>>> b = B()
B
A
Ma attenzione: Questo self.super()
non è equivalente ai super(B, self)
- se A
chiamato anche self.super().__init__()
, la costruzione di un B
causerebbe il costruttore A
chiamare indefinitamente, in quanto self.__class__
rimarrà B
. Ciò è dovuto alla mancanza dello __class__
menzionato nello accepted answer. È possibile aggirare questo problema con una macchina a stati nascosti o un metaclasse sofisticato che, ad es. controlla la posizione attuale della classe in self.__class__.mro()
, ma ne vale davvero la pena? Probabilmente no ...
Mi rendo conto che questa domanda è vecchia e la risposta selezionata potrebbe essere stata corretta al momento, ma non è più completa. Non è ancora possibile utilizzare super()
a 2.5.6, ma python-future
fornisce un back-ported implementation per 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
Se si utilizza pylint
, è possibile disattivare gli avvisi legacy con il commento:
# pylint: disable=missing-super-argument
Bello, grazie :) –
- 1. Python 3, super .__ del __()
- 2. Utilizzo di Python 3 super()
- 3. Python allungabile con - con super() Python 3 vs Python 2
- 4. Come posso usare super() con un argomento in python
- 5. Python: Perché non posso usare `super` su una classe?
- 6. Python 3: super() solleva TypeError in modo imprevisto
- 7. Argomenti Python super(): perché non super (obj)?
- 8. Come usare wxPython per Python 3?
- 9. Si può usare Clutter con Python 3?
- 10. Come usare flake8 per Python 3?
- 11. Python - Virtualenv, python 3?
- 12. Python super() non credibile
- 13. Non posso usare unichr in Python 3.1
- 14. Perché la magia super() di Python 3.x è eccellente?
- 15. Quando chiamare Python super() .__ init __()?
- 16. Posso usare python con giraph?
- 17. Nuovo in Python ... Python 3 e Matplotlib
- 18. python 3 in emacs
- 19. Voglio usare NumPy/SciPy. Dovrei usare Python 2 o 3?
- 20. S3BotoStorage in python 3
- 21. string.lower in Python 3
- 22. Come posso importare FileNotFoundError da Python 3?
- 23. Posso usare Artifactory con Python PIP?
- 24. comprensione dizionario in Python 3
- 25. Perché python super non accetta solo l'istanza?
- 26. Nuovo progetto: Python 2 o Python 3?
- 27. Come usare gexiv2 in python?
- 28. Posso usare metodi esterni come route decorator in Python/Flask?
- 29. Implementazione Websocket in Python 3
- 30. coda ImportError in python 3
Grazie. Ero confuso perché una versione precedente di questo PEP diceva che avresti importato con 'from __future__ import new_super' che non funziona. –