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

Почему я должен указывать свой собственный класс при использовании функции super(), и есть ли способ обойти это?

При использовании Python super() для выполнения цепочки методов вы должны явно указать свой собственный класс, например:

class MyDecorator(Decorator):
    def decorate(self):
        super(MyDecorator, self).decorate()

Мне нужно указать имя моего класса MyDecorator как аргумент super(). Это не СУХОЙ. Когда я переименую свой класс, мне придется переименовать его дважды. Почему это реализовано таким образом? И есть ли способ ласка из необходимости написать имя класса дважды (или больше)?

4b9b3361

Ответ 2

Ваши желания сбываются:

Просто используйте 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)

Ответ 3

Этот ответ неверен, попробуйте:

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

Ответ 4

вы также можете избежать написания конкретного имени класса в более старых версиях python с помощью

def __init__(self):
    super(self.__class__, self)
    ...