Подтвердить что ты не робот

Могу ли я использовать Python 3 super() в Python 2.5.6?

Можно ли использовать чистый Python 3 super() синтаксис в Python 2.5.6?
Может быть, с каким-то __future__ импортом?

4b9b3361

Ответ 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(), но действительно ли это стоит? Наверное, не...