Могу ли я использовать Python 3 super () в Python 2.5.6? - PullRequest
15 голосов
/ 11 октября 2011

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

Ответы [ 4 ]

20 голосов
/ 11 мая 2015

Я понимаю, что этот вопрос старый, и выбранный ответ мог быть правильным в то время, но он больше не завершен.Вы все еще не можете использовать super() в 2.5.6, но python-future обеспечивает реализацию с обратным портированием для 2.6 +:

Установить python-futureс:

% pip install future

Ниже показано переопределение super в builtins:

% python
...
>>> import sys
>>> sys.version_info[:3]
(2, 7, 9)
>>>
>>> super
<type 'super'>
>>>
>>> from builtins import *
>>> super
<function newsuper at 0x000000010b4832e0>
>>> super.__module__
'future.builtins.newsuper'

Может использоваться следующим образом:

from builtins import super

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
15 голосов
/ 11 октября 2011

Вы не можете использовать пустой вызов super(), который не содержит тип / класс.Вы также не можете реализовать замену, которая будет работать.Python 3.x содержит специальную поддержку для включения голых вызовов super() (он помещает переменную ячейки __class__ во все функции, определенные в классе - см. PEP 3135


Обновление

Начиная с Python 2.6+, голые super() вызовы могут использоваться через пакет future Python. См. Ответ Позиты для объяснения.

6 голосов
/ 11 октября 2011

Нет, вы не можете.Но вы можете использовать Python 2 super() в Python 3.

3 голосов
/ 16 мая 2013

Примечание Это ужасное "решение", я выкладываю его только для того, чтобы не делать это дома!
Я повторяю: делатьне делайте этого

Можно подумать об использовании этого миксина

class Super(object):
    def super(self):
        return super(self.__class__, self)

для получения 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__(), конструкция B вызовет конструктор Aназывать себя бесконечно, так как self.__class__ останется B.Это связано с отсутствием __class__, упомянутого в принятом ответе .Вы можете обойти эту проблему с помощью скрытого конечного автомата или сложного метакласса, который, например, проверяет фактическое положение класса в self.__class__.mro(), но стоит ли оно того?Наверное, нет ...

...