【问题标题】:Calling a child method in a parent class in Python在 Python 中调用父类中的子方法
【发布时间】:2019-06-14 16:40:33
【问题描述】:

注意:不是Calling a parent method in a child class .super()

我有三个班级,比如说ParentChild1Child2Child1 和 2 都有方法 Cry()Parent 类有另一种方法,例如MakeChildrenStopCry(),其中调用了 Cry()。但是,Parent 类没有方法 Cry()。我需要在Parent 类中定义Cry() 吗?

由于我没有父类的任何对象并且我总是使用子类,所以我只是创建了“空函数”,因为继承只会用 Child 类中的函数覆盖这些空函数。

def MakeChildrenStopCry(self):
   if self.Cry():
    self.DoWhateverToStopCry(self)
def Cry(self)
   return()

对于完整的示例代码you can check this,但我认为上面应该很清楚。

这不会导致我的代码出现任何问题,我只是想知道正常执行的操作,或者以不同的方式设置我的代码是否更好。

【问题讨论】:

  • 您可能会将子实例传递给该方法,否则您怎么知道要在哪个子实例上调用.cry() 方法?
  • 好的,传递一个孩子的实例,让我看看。哪个子实例调用 cry 方法并不重要,您实际上知道这一点,因为您创建了子实例并定义了函数在特定子类中的作用。
  • 嗯,这就是我的意思。您不会真正创建特定的子类,而是从单个子类创建特定的子实例。将类想象为您创建具有特定属性的实例的蓝图。同样,您不会说所有父母都是 49 岁,您会说父母有 age 属性,并且特定的父母(实例)很可能是 49 岁,但他们也很可能是几乎任何其他年龄。不过,解释类的概念确实超出了 SO 的范围。
  • "你可以从一个子类中创建特定的子实例。"所以我有这个方法解释信号,但是每个子类都以不同的方式解释信号,所以这不起作用。谢谢你的帮助,但你太详细了^^这只是关于Python如何处理这些事情,Serge Ballesta的回答完全回答了这个问题

标签: python class inheritance polymorphism parent-child


【解决方案1】:

Python 在这个级别上是相当有信心的程序员。你总是可以从一个类中调用一个cry 方法,即使它没有在类中定义。 Python 只会相信你提供一个知道 cry 方法的对象,如果会被调用。

所以这很好:

class Parent:
    def makeChildrenStopCry(self):
        if self.cry():
            self.doWhateverToStopCry()

class Children(Parent):
    crying = False
    def makeCry(self):
        self.crying = True
    def doWhateverToStopCry(self):
        self.crying = False
    def cry(self):
        return self.crying

它提供了一个交互式会话:

>>> child = Children()
>>> child.makeCry()
>>> print(child.crying)
True
>>> child.makeChildrenStopCry()
>>> print(child.crying)
False

【讨论】:

    【解决方案2】:

    如果父级有抽象方法怎么办?

    class Parent:
        def cry(self):
            raise NotImplementedError
    
        def doWhateverToStopCry(self):
            raise NotImplementedError
    
        def makeChildrenStopCry(self):
            if self.cry():
                self.doWhateverToStopCry()
    
    class Children(Parent):
        crying = False
        def makeCry(self):
            self.crying = True
        def doWhateverToStopCry(self):
            self.crying = False
        def cry(self):
            return self.crying
    

    【讨论】:

      猜你喜欢
      • 2014-07-07
      • 2016-02-14
      • 1970-01-01
      • 1970-01-01
      • 2014-09-23
      • 1970-01-01
      • 1970-01-01
      • 2013-07-16
      • 2020-01-14
      相关资源
      最近更新 更多