我在覆盖子类中的方法时经常这样做:
def method_x(self):
x = super(type(self), self).method_x()
[Some extra code]
return x
我的问题是:超级(类型(自我),自我)是否有捷径?
答案 0 :(得分:18)
不要那样做:如果super
只能使用type(self)
作为它的第一个参数,那么它就不会被编写为首先采用两个参数。你必须在这里传递实际的类而不是一个表达式,如果该类已经被子类化,它可能会改变。
super的第一个参数需要是包含当前方法定义的类,因为你要告诉super在开始搜索的列表中的位置。
Python 3知道这一点并在编译时神奇地对待super()
,但在Python 2.x中它只是一个普通的函数,所以它无法为自己找出这些参数。
[编辑添加到我的初始点]
实际上,在Python 2.x中使用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
来执行此操作,但是您无法创建未绑定的{{1直接在类定义中(因为如果它不存在,你不能命名该类),如果你在外面创建它,你必须手动模糊名称,以确保为类设置正确的super
对象。对于Python 2.6及更高版本,您可以将其作为类装饰器进行封装。