繁体   English   中英

super(type(self),self)的快捷方式

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM