Почему я должен указать свой собственный класс при использовании super (), и есть ли способ обойти это? - PullRequest
14 голосов
/ 21 января 2009

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

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

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

Ответы [ 4 ]

11 голосов
/ 21 января 2009

Ваши желания сбудутся:

Просто используйте 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)
6 голосов
/ 21 января 2009

BDFL соглашается. См. Pep 367 - новый Super для 2.6 и PEP 3135 - новый Super для 3.0.

3 голосов
/ 19 августа 2014

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

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
0 голосов
/ 21 января 2009

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

def __init__(self):
    super(self.__class__, self)
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...