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没有op1和op2.
我看到有"超级"选项,但我不确定我是否理解如何使用它.
您可以在以下位置调用超类实现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().