17

当使用 Pythonsuper()做方法链时,你必须明确指定你自己的类,例如:

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

我必须将我的班级名称指定MyDecoratorsuper(). 这不是 DRY。当我现在重命名我的班级时,我将不得不重命名它两次。为什么以这种方式实施?有没有办法摆脱不得不写两次(或更多)类名的麻烦?

4

4 回答 4

11

在 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)
于 2009-01-21T19:31:04.183 回答
7

BDFL 同意。请参阅PEP 3135 - Python 3.0 的新超级(和Pep 367 - Python 2.6 的新超级)。

于 2009-01-21T19:28:33.660 回答
4

这个答案是错误的,试试:

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
于 2014-08-19T07:19:10.693 回答
-1

您还可以通过使用避免在旧版本的 python 中编写具体的类名

def __init__(self):
    super(self.__class__, self)
    ...
于 2009-01-21T20:49:17.320 回答