super(类型(self),self)的快捷方式

时间:2011-02-03 08:26:41

标签: python

我在覆盖子类中的方法时经常这样做:

def method_x(self):
    x = super(type(self), self).method_x()

    [Some extra code]
    return x

我的问题是:超级(类型(自我),自我)是否有捷径?

1 个答案:

答案 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及更高版本,您可以将其作为类装饰器进行封装​​。