当使用 Pythonsuper()
做方法链时,你必须明确指定你自己的类,例如:
class MyDecorator(Decorator):
def decorate(self):
super(MyDecorator, self).decorate()
我必须将我的班级名称指定MyDecorator
为super()
. 这不是 DRY。当我现在重命名我的班级时,我将不得不重命名它两次。为什么以这种方式实施?有没有办法摆脱不得不写两次(或更多)类名的麻烦?
当使用 Pythonsuper()
做方法链时,你必须明确指定你自己的类,例如:
class MyDecorator(Decorator):
def decorate(self):
super(MyDecorator, self).decorate()
我必须将我的班级名称指定MyDecorator
为super()
. 这不是 DRY。当我现在重命名我的班级时,我将不得不重命名它两次。为什么以这种方式实施?有没有办法摆脱不得不写两次(或更多)类名的麻烦?
在 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)
BDFL 同意。请参阅PEP 3135 - Python 3.0 的新超级(和Pep 367 - Python 2.6 的新超级)。
这个答案是错误的,试试:
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
您还可以通过使用避免在旧版本的 python 中编写具体的类名
def __init__(self):
super(self.__class__, self)
...