Можно ли использовать чистый Python 3 super()
синтаксис в Python 2.5.6?
Может быть, с каким-то __future__
импортом?
Могу ли я использовать Python 3 super() в Python 2.5.6?
Ответ 1
Вы не можете использовать голой вызов super()
, который не содержит тип/класс. Вы также не можете выполнить замену, которая будет работать. Python 3.x содержит специальную поддержку для включения голосных вызовов super()
(он помещает переменную ячейки __class__
во все функции, определенные внутри класса - см. PEP 3135
Ответ 2
Я понимаю, что этот вопрос старый, и выбранный ответ, возможно, был правильным в то время, но он больше не завершен. Вы по-прежнему не можете использовать super()
в 2.5.6, но python-future
предоставляет back-ported implementation для 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
Если вы используете pylint
, вы можете отключить устаревшие предупреждения с комментарием:
# pylint: disable=missing-super-argument
Ответ 3
Нет, вы не можете. Но вы можете использовать Python 2 super()
в Python 3.
Ответ 4
Примечание Это ужасное "решение", я публикую его только для того, чтобы убедиться, что вы не делаете этого дома!
Повторяю: не делайте этого
Можно подумать об использовании этого mixin
class Super(object):
def super(self):
return super(self.__class__, self)
чтобы получить a self.super()
:
class A(object, Super):
def __init__(self):
print "A"
class B(A):
def __init__(self):
print "B"
self.super().__init__()
получая:
>>> a = A()
A
>>> b = B()
B
A
Но будьте осторожны: Этот self.super()
не эквивалентен super(B, self)
- если A
также называется self.super().__init__()
, то построение a B
приведет к конструктору A
называть себя неопределенно, так как self.__class__
останется B
. Это связано с отсутствием __class__
, упомянутым в принятом ответе . Вы можете обойти эту проблему со скрытым конечным автоматом или сложным метаклассом, например, проверяет фактическую позицию класса в self.__class__.mro()
, но действительно ли это стоит? Наверное, не...