在另一个子方法中调用从父类继承的子方法
Call a child method inherit from parents inside another child method
Child
class中的方法Eval
继承自Parents
class; Child
class 中的方法 FirstOrder
调用 Child
class 中的方法 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
class中定义方法Eval
。既然定义明确,那么就调用Eval
in Parents
class.
您没有从 Child.Eval()
返回任何内容,所以 it returns None
implicitly。您只需要添加 return
:
def Eval(self, x):
return super(Child, self).Eval(x)
但是,这不是继承,而是委托。使用继承意味着不定义 Child.Eval()
。事实上,这是更好的选择,因为 Child.Eval()
没有做任何额外的事情。
Child
class中的方法Eval
继承自Parents
class; Child
class 中的方法 FirstOrder
调用 Child
class 中的方法 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
class中定义方法Eval
。既然定义明确,那么就调用Eval
in Parents
class.
您没有从 Child.Eval()
返回任何内容,所以 it returns None
implicitly。您只需要添加 return
:
def Eval(self, x):
return super(Child, self).Eval(x)
但是,这不是继承,而是委托。使用继承意味着不定义 Child.Eval()
。事实上,这是更好的选择,因为 Child.Eval()
没有做任何额外的事情。