Ответ 1
BDFL соглашается. См. Pep 367 - новый супер для 2.6 и PEP 3135 - новый супер для версии 3.0.
При использовании Python super()
для выполнения цепочки методов вы должны явно указать свой собственный класс, например:
class MyDecorator(Decorator):
def decorate(self):
super(MyDecorator, self).decorate()
Мне нужно указать имя моего класса MyDecorator
как аргумент super()
. Это не СУХОЙ. Когда я переименую свой класс, мне придется переименовать его дважды. Почему это реализовано таким образом? И есть ли способ ласка из необходимости написать имя класса дважды (или больше)?
BDFL соглашается. См. Pep 367 - новый супер для 2.6 и PEP 3135 - новый супер для версии 3.0.
Ваши желания сбываются:
Просто используйте python 3.0. В нем вы просто используете super()
, и он делает super(ThisClass, self)
.
Документация здесь. Пример кода из документации:
class C(B):
def method(self, arg):
super().method(arg)
# This does the same thing as: super(C, self).method(arg)
Этот ответ неверен, попробуйте:
def _super(cls):
setattr(cls, '_super', lambda self: super(cls, self))
return cls
class A(object):
def f(self):
print 'A.f'
@_super
class B(A):
def f(self):
self._super().f()
@_super
class C(B):
def f(self):
self._super().f()
C().f() # maximum recursion error
В Python 2 есть способ использования декоратора:
def _super(cls):
setattr(cls, '_super', lambda self: super(cls, self))
return cls
class A(object):
def f(self):
print 'A.f'
@_super
class B(A):
def f(self):
self._super().f()
B().f() # >>> A.f
вы также можете избежать написания конкретного имени класса в более старых версиях python с помощью
def __init__(self):
super(self.__class__, self)
...