【问题标题】:Call a child method inherit from parents inside another child method调用子方法继承自另一个子方法中的父项
【发布时间】:2021-03-24 20:15:06
【问题描述】:

Child类中的方法Eval继承自Parents类; Child 类中的方法 FirstOrder 调用 Child 类中的方法 Eval。代码:

class Parents:
     def Eval(self, x):
         return value, grad

class Child(Parents):
     def Eval(self, x):
         super(Child, self).Eval(x)

     def FirstOrder(self, x, x0):
         val, grad = self.Eval(x0)
         return val + grad * (x-x0)

然后得到:

TypeError: cannot unpack non-iterable NoneType object

我知道一个简单的解决方案是将self.Eval(x0) 更改为super(Child, self).Eval(x0)。但我想知道为什么。据我了解,在FirstOrder 中调用self.Eval(x0) 将导致在Child 类中定义方法Eval。既然定义明确了,那么就调用Parents类中的Eval。

【问题讨论】:

  • 您忘记在Child 中从Eval 转至return
  • @RobinZigmond 感谢这么快的回复!我是 python 新手。所以Child中Eval中的return不能从Parents中super中的return继承?
  • 我只是说super(Child, self).Eval(x)前面应该有一个return。需要返回super调用的结果,否则子方法会隐式返回None。
  • @Silentmovie "return" 不继承。那没有任何意义。继承适用于对象的属性。在Child.Eval 中,您只需调用super(Child, self).Eval(x),它会评估value, grad 是什么,但您不对该返回值做任何事情,然后函数终止并默认返回None
  • 这不是真正的继承,更像是委托。 @juanpa 我很确定Child.Eval 是多余的,对吧?并且继承Parents.Eval会更容易?

标签: python parent-child


【解决方案1】:

你没有从Child.Eval()返回任何东西,所以it returns None implicitly。你只需要添加return:

def Eval(self, x):
     return super(Child, self).Eval(x)

但是,这不是继承,而是委托。使用继承意味着不定义Child.Eval()。事实上,这是更好的选择,因为 Child.Eval() 没有做任何额外的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 2014-05-10
    相关资源
    最近更新 更多