为什么在使用super()时我必须指定自己的类,有没有办法解决它?

时间:2009-01-21 19:20:58

标签: python multiple-inheritance

使用Python的super()进行方法链接时,必须明确指定自己的类,例如:

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

我必须指定我的班级MyDecorator的名称作为super()的参数。这不是DRY。当我重命名我的课程时,我将不得不重命名它两次。为什么这样实现?有没有办法避免必须两次(或更多)写出类的名称?

4 个答案:

答案 0 :(得分:11)

你的愿望成真:

使用python 3.0。在其中,您只需使用super()即可super(ThisClass, self)

文档here。文档中的代码示例:

class C(B):
    def method(self, arg):
        super().method(arg)    
        # This does the same thing as: super(C, self).method(arg)

答案 1 :(得分:6)

BDFL同意。请参阅Pep 367 - New Super获取2.6和PEP 3135 - New Super获取3.0。

答案 2 :(得分: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

答案 3 :(得分:0)

您还可以使用

避免在旧版本的python中编写具体的类名
def __init__(self):
    super(self.__class__, self)
    ...