当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python super用法及代码示例


用法:

class super([type[, object-or-type]])

返回一个代理对象,该对象将方法调用委托给 type 的父类或兄弟类。这对于访问已在类中重写的继承方法很有用。

object-or-type 确定要搜索的方法解析顺序。搜索从 type 之后的类开始。

例如,如果 object-or-type__mro__D -> B -> C -> A -> object 并且 type 的值是 B ,则 super() 搜索 C -> A -> object

object-or-type__mro__ 属性列出了 getattr()super() 使用的方法解析搜索顺序。该属性是动态的,并且可以在更新继承层次结构时更改。

如果省略第二个参数,则返回的超级对象是未绑定的。如果第二个参数是一个对象,isinstance(obj, type) 必须为真。如果第二个参数是类型,issubclass(type2, type) 必须为真(这对类方法很有用)。

super 有两个典型用例。在具有单继承的类层次结构中,super 可用于引用父类而不显式命名它们,从而使代码更易于维护。这种用法与在其他编程语言中使用super 非常相似。

第二个用例是在动态执行环境中支持协作多重继承。这个用例是 Python 独有的,在静态编译的语言或仅支持单继承的语言中找不到。这使得实现“diamond diagrams” 成为可能,其中多个基类实现相同的方法。好的设计要求这样的实现在每种情况下都具有相同的调用签名(因为调用的顺序是在运行时确定的,因为该顺序会适应类层次结构的变化,并且因为该顺序可以包括在运行前未知的兄弟类)。

对于这两个用例,典型的超类调用如下所示:

class C(B):
    def method(self, arg):
        super().method(arg)    # This does the same thing as:
                               # super(C, self).method(arg)

除了方法查找,super() 也适用于属性查找。一种可能的用例是调用父类或兄弟类中的说明符。

请注意,super() 是作为显式点属性查找的绑定过程的一部分实现的,例如 super().__getitem__(name) 。它通过实现自己的__getattribute__() 方法来以支持协作多重继承的可预测顺序搜索类来实现这一点。因此,super() 对于使用语句或运算符(例如 super()[name] )的隐式查找未定义。

另请注意,除了零参数形式之外,super() 不限于使用内部方法。两个参数形式精确地指定参数并进行适当的引用。零参数形式仅适用于类定义,因为编译器填写必要的详细信息以正确检索正在定义的类,以及访问普通方法的当前实例。

有关如何使用 super() 设计协作类的实用建议,请参阅 guide to using super()

相关用法


注:本文由纯净天空筛选整理自python.org大神的英文原创作品 super。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。