当我在子类中重写一个方法时,我经常这样做:
def method_x(self):
x = super(type(self), self).method_x()
[Some extra code]
return x
我的问题是:有没有一种简便方式可以达到 super(type(self), self) 的效果?
当我在子类中重写一个方法时,我经常这样做:
def method_x(self):
x = super(type(self), self).method_x()
[Some extra code]
return x
我的问题是:有没有一种简便方式可以达到 super(type(self), self) 的效果?
super
只能使用type(self)
作为第一个参数,那么它就没有必要在第一次编写时采用两个参数的形式。在这里,您必须传递实际的类,而不是可能因为类已被子类化而发生变化的表达式。super()
,但在Python 2.x中,它只是一个普通函数,因此无法自行找出这些参数。super()
的方法。您可以使用未绑定形式的super,并在访问时将其绑定:>>> class A(object):
def foo(self):
print "A.foo"
>>> class B(A):
def foo(self):
self.__super.foo()
print "B.foo"
>>> B._B__super = super(B)
>>> class C(A):
def foo(self):
self.__super.foo()
print "C.foo"
>>> C._C__super = super(C)
>>> class D(C,B): pass
>>> D._D__super = super(D)
>>> D().foo()
A.foo
B.foo
C.foo
这里有一个重要的注意点:您必须为每个super
对象使用不同的名称进行存储,可以通过使用self.__super
来实现,但是您不能直接在类定义中创建未绑定的super
(因为如果该类尚不存在,则无法命名该类),如果在外部创建它,则必须手动混淆名称以确保为类设置了正确的__super
对象。对于Python 2.6及更高版本,您可能可以将其包装为一个类装饰器。
super(self.__class__, self)
会更好吗? - martineausuper
的第一个参数是继承链中的当前类,因此超级可以找出下一个类是哪个。说type(self)
或self.__class__
将给出最高类,如果那是前面的类,就会导致无限循环。请参见:http://pastebin.com/vhu5urCL - Glenn Maynard