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

Gar*_*rwe 8 python

我经常在覆盖子类中的方法时执行此操作:

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

    [Some extra code]
    return x
Run Code Online (Sandbox Code Playgroud)

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

Dun*_*can 18

不要这样做:如果super可以只使用type(self)它作为它的第一个参数,那么它就不会被编写为首先采用两个参数.你必须在这里传递实际的类,而不是一个表达式,如果类被子类化,它可能会改变.

super的第一个参数需要是包含当前方法定义的类,因为你要告诉super在开始搜索的列表中的位置.

Python 3知道这一点,并super()在编译时神奇地对待,但在Python 2.x中它只是一个普通的函数,所以它无法为自己找出这些参数.

[编辑添加到我的初始点]实际上,super()在Python 2.x中使用另一种较少使用的方法.您可以使用未绑定的超级形式,并在访问它时绑定它:

>>> 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
Run Code Online (Sandbox Code Playgroud)

这里有一个重要的难题:你必须使用不同的名称来存储每个super对象,您可以通过使用做self.__super,但你不能创建一个未绑定的super类定义直接(因为如果它不"你不能将类命名但是如果你在外面创建它,你必须手动模糊名称,以确保__super为类设置正确的对象.对于Python 2.6及更高版本,您可以将其作为类装饰器进行封装​​.

  • 是的,这很麻烦,这可能是为什么它不太常用,但我想我应该把它作为一种选择.当然,更好的选择就是使用Python 3.x(根据它支持你需要的任何库) (2认同)