【问题标题】:Call parent method inside super().__init__ when method is overriden by child当方法被孩子覆盖时,​​在 super().__init__ 中调用父方法
【发布时间】:2020-09-20 00:17:02
【问题描述】:

我已经覆盖了子类中的一个方法。 该方法在父类构造函数中使用。 在子类中调用super().__init__ 时,会在父类的构造函数中执行子类的方法,而不是父类的方法。

例子:

class A:
    def __init__(self):
        self.method()

    def method(self):
        print('parent method!')

class B(A):
    def __init__(self):
        super().__init__()

    def method(self):
        print('child method!')

b = B()

输出:child method!

虽然我想得到parent method!

编辑:

我需要父类的构造函数来使用未覆盖的方法,但之后每次从父类调用method() 都应该调用覆盖的方法。

【问题讨论】:

  • AFAIK,当您在父子节点中都有类似的方法时,子方法将优先于子实例。你为什么不重命名其中之一?
  • 因为我需要使用不覆盖的方法调用父级的构造函数,但是我每次都需要使用覆盖的构造函数。

标签: python oop


【解决方案1】:

如果你有这种情况,我会建议如下:

class B(A):
    def __init__(self):
        super().__init()
        self.n_method = 1
    def method(self):
        if self.n_method == 1:
            super().method()
        else:
            do method B stuffs
        self.n_method += 1

【讨论】:

  • 这解决了它,但它有点hacky而且不是很OO。我会投赞成票,但请检查 chepner 的回答。
  • 这是一个很好的解决方案,但我不确定您是否要在每次创建父实例时调用父方法。
【解决方案2】:

因为我需要使用不覆盖的方法调用父级的构造函数,但是我每次都需要使用覆盖的构造函数。

这表明您要求一种方法做太多事情。将method 拆分为两部分:一个A.__init__ 覆盖并调用,另一个可以 覆盖。类似的东西

class A:
    def __init__(self):
        self._init_method()

    def _init_method(self):
        print('parent method!')

    def method(self):
        self._init_method()


class B(A):
    def __init__(self):
        super().__init__()

    def method(self):
        print('child method!')

b = B()

_init_method 执行您声称需要从 A.__init__ 执行的操作。同时,你可以让method 做同样的事情,除非你覆盖它,在这种情况下你会做任何你想让B.method 做的事情。

【讨论】:

    【解决方案3】:

    A__init__() 方法中,您可以编写A.method(self) 而不是self.method(),以便更明确地说明要调用哪个method

    【讨论】:

      猜你喜欢
      • 2022-11-25
      • 2012-08-09
      • 2012-05-01
      • 2011-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      • 1970-01-01
      相关资源
      最近更新 更多