使用Python的super()
进行方法链接时,必须明确指定自己的类,例如:
class MyDecorator(Decorator):
def decorate(self):
super(MyDecorator, self).decorate()
我必须指定我的班级MyDecorator
的名称作为super()
的参数。这不是DRY。当我重命名我的课程时,我将不得不重命名它两次。为什么这样实现?有没有办法避免必须两次(或更多)写出类的名称?
答案 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)
...