【发布时间】: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