[英]Shortcut for 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的第一个参数必须是包含当前方法定义的类,因为您要告诉super在基础列表中从哪里开始搜索。
Python 3知道这一点,并在编译时神奇地对待了super()
,但是在Python 2.x中,它只是一个普通的函数,因此它无法自行找出这些参数。
[编辑以补充我的主要观点]实际上,在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和更高版本,您可以将其包装为类装饰器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.