【问题标题】:Python inheritance - how to inherit class function?Python继承——如何继承类函数?
【发布时间】:2013-12-05 15:01:12
【问题描述】:

我是 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() 这样在使用此类时,我可以选择使用op1op2op3

我尝试过使用:

def func1(self):
    op3()

但它只是给了我op3 没有op1op2 的选项。

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

【问题讨论】:

  • 另外,你需要有__init__,而不是_init_

标签: python class inheritance


【解决方案1】:

可以调用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()

【讨论】:

  • 或者A.func1(self),不是吗?
  • @qwertynl:是的,但那是一个不合作的调用。使用super(),您也可以添加另一个版本的func1()
  • @qwertynl 在这么简单的情况下,是的。但是使用class B(A,C,F,G):,这些父类具有类似的依赖关系,它变得更加复杂。
  • 那么 A.func1(self) 和 super(B,self) 有区别吗?
  • @user1386966:直到你开始混合更多的基类,或者创建更复杂的结构。问题是,生产代码具有随着时间的推移不断发展和变得更加复杂的习惯。
猜你喜欢
  • 2018-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-28
  • 1970-01-01
  • 2014-02-25
相关资源
最近更新 更多