Python继承 - 如何继承类函数?

use*_*966 5 python inheritance class

我是python的新手,在继承方面遇到了一些麻烦.

我有这堂课:

class A(object):
    def __init__(self, foo, bar):
        pass     
    def func1(self):
        op1()
        op2()
    def func2(self):
        pass
Run Code Online (Sandbox Code Playgroud)

我正在使用另一个覆盖它的类:

class B(A):
    def func2(self):
        # do something
Run Code Online (Sandbox Code Playgroud)

问题是我希望得到func1它的所有操作并添加例如,op3() 以便在使用这个类时我可以选择使用op1,op2或者op3.

我尝试过使用:

def func1(self):
    op3()
Run Code Online (Sandbox Code Playgroud)

但它只是让我选择op3没有op1op2.

我看到有"超级"选项,但我不确定我是否理解如何使用它.

Mar*_*ers 7

您可以在以下位置调用超类实现func1:

class B(A):
    def func1(self):
        super(B, self).func1()
        op3()
Run Code Online (Sandbox Code Playgroud)

这里super(B, self).func1将在MRO中搜索类层次结构(方法解析顺序),从类B开始搜索下一个func1()方法,将其绑定到self并调用它.

这将调用原始的func1()第一个,执行op1()op2(),然后被覆盖的版本可以添加要遵循的新操作.

您也可以op3() 调用,然后调用基础实现.

您也可以直接在类上查找父方法A,但该方法将被解除绑定.self明确传递:

class B(A):
    def func1(self):
        A.func1(self)
        op3()
Run Code Online (Sandbox Code Playgroud)

这绕过了搜索类继承层次结构,使您的类不那么灵活.

有关何时使用的一些非常实用的建议,请参阅Raymond Hettinger的博客文章super()super().

  • @qwertynl:是的,但这是一次非合作调用.使用`super()`你可以在混合中添加另一个版本的`func1()`. (2认同)