Czy mogę używać czystej składni Python 3 super()
w Pythonie 2.5.6?
Może z jakimś rodzajem importu __future__
?Czy mogę używać Python 3 super() w Pythonie 2.5.6?
Odpowiedz
Nie możesz użyć gołego połączenia super()
, które nie zawiera typu/klasy. Nie możesz też zastąpić tego, który będzie działał. Python 3.x zawiera specjalne wsparcie w celu umożliwienia gołe super()
połączenia (umieszcza zmienną __class__
komórek we wszystkich funkcji zdefiniowanych w klasie - zobacz Pep 3135
Nie, nie możesz. Ale możesz użyć Pythona 2: super()
w Pythonie 3.
Uwaga To jest straszne „rozwiązanie”, ja tylko po to, aby ! upewnij ty nie robić tego w domu
powtarzam: nie rób tego
One mogą myśleć o użyciu tej mixin
class Super(object):
def super(self):
return super(self.__class__, self)
do uzyskania self.super()
:
class A(object, Super):
def __init__(self):
print "A"
class B(A):
def __init__(self):
print "B"
self.super().__init__()
otrzymując:
>>> a = A()
A
>>> b = B()
B
A
Ale uwaga: ten self.super()
nie jest równoznaczne z super(B, self)
- jeśli A
zwany także self.super().__init__()
, budowa B
spowodowałoby konstruktor A
, aby wywoływał się w nieskończoność, ponieważ self.__class__
pozostanie B
. Wynika to z braku __class__
wspomnianego w accepted answer. Można obejść ten problem, korzystając z ukrytego automatu stanów lub zaawansowanego metaklasu, który np. sprawdza aktualną pozycję klasy w self.__class__.mro()
, ale czy naprawdę jest tego warta? Prawdopodobnie nie ...
Zdaję sobie sprawę, że to pytanie jest stare, a wybrana odpowiedź mogła być prawidłowa, ale nie jest już kompletna. Nadal nie można używać super()
w 2.5.6, ale python-future
zapewnia back-ported implementation dla 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
Jeśli używasz pylint
można wyłączyć starszych ostrzeżenia z komentarzem:
# pylint: disable=missing-super-argument
Fajna, dzięki :) –
- 1. Czy warto używać super() w Pythonie?
- 2. Jak mogę używać super() z jednym argumentem w Pythonie
- 3. Czy można używać gniazd internetowych w Flask i Pythonie 3?
- 4. Czy mogę używać Artifactory z PIP Python?
- 5. Jak używać string.replace() w python 3.x
- 6. Python 3 typy wbudowane __init__ nie wywołuje super() .__ init__?
- 7. Czy mogę podać adres URL do lxml.etree.parse na Pythonie 3?
- 8. mieszania Super i klasyczne połączenia w Pythonie
- 9. Czytaj MP3 w Pythonie 3
- 10. Python Super __init__ dziedziczenie
- 11. Python + OpenCV 3 - nie można używać SIFT
- 12. Czy readlines() zwraca listę lub iterator w Pythonie 3?
- 13. Python klasa - Super zmienna
- 14. Maksymalny błąd głębokości rekursji w Pythonie podczas wywoływania super-init.
- 15. Co zastępuje xreadlines() w Pythonie 3?
- 16. Expat parsowania w python 3
- 17. Czy PySide obsługuje Python 3?
- 18. brakuje argrtu w python 3
- 19. string.lower w Pythonie 3
- 20. Python - Virtualenv, python 3?
- 21. Python 3 string.join() odpowiada?
- 22. Jak uniknąć bojownika podczas używania super (...) w Pythonie 2.6+?
- 23. obsługuje nolearn/Lasagne Pythonie 3
- 24. Python super() spadków i potrzebne argumenty
- 25. Typy wbudowanych podklas w Pythonie 2 i Pythonie 3
- 26. Python 3 zamiennik PyFile_AsFile
- 27. innego typu() funkcji w Pythonie 2 Python 3
- 28. Czy mogę używać TLS w wersji 1.1 lub 1.2 w pythonie 2?
- 29. Złapać przerwaną rurę w Pythonie 2 I Pythonie 3
- 30. Czy to prawda, że nie mogę używać nawiasów klamrowych w Pythonie?
Dzięki. Byłem zdezorientowany, ponieważ wcześniejsza wersja tego dokumentu mówiła, że zaimportujesz go z 'from __future__ import new_super', który nie działa. –