我是python的新手,在继承方面遇到了一些麻烦。
我有这堂课:
class A(object):
def __init__(self, foo, bar):
pass
def func1(self):
op1()
op2()
def func2(self):
pass
我正在使用另一个覆盖它的类:
class B(A):
def func2(self):
# do something
问题是我希望func1
获取其所有操作并添加例如op3()
因此,在使用此课程时,我可以选择使用op1
,op2
或op3
。
我尝试过使用:
def func1(self):
op3()
但它只是给了我op3
没有op1
和op2
的选项。
我看到有“超级”选项,但我不确定我是否理解如何使用它。
答案 0 :(得分:7)
您可以在func1
中调用超类实现:
class B(A):
def func1(self):
super(B, self).func1()
op3()
此处super(B, self).func1
将在MRO(方法解析顺序)中搜索类层次结构,从类B
开始搜索下一个func1()
方法,将其绑定到self
并让你叫它。
这将首先调用原始func1()
,执行op1()
和op2()
,然后您的被覆盖版本可以添加新操作。
您也可以先调用op3()
,然后调用基础实现。
您也可以直接在类A
上查找父方法,但该方法将被解除绑定。明确传递self
:
class B(A):
def func1(self):
A.func1(self)
op3()
这会绕过搜索类继承层次结构,使您的类不那么灵活。
有关何时使用super()
的详细实用建议,请参阅Raymond Hettinger's blog post on super()
。