Python超类调用子类
我试图编写一个通用类,这样这个类(MLE)就可以调用一组具有类似函数(例如set_param(),fit())的子类(NormMLE,BinMLE) 调用fit()时,结果返回None 现在,我一定是误解了python中OOP的概念。当超类分别调用set_param()和fit()时,子类中的参数u、v和w(可选)似乎是不可访问的 我可以知道实现我想要的OOP的正确方法是什么吗?您的Python超类调用子类,python,python-2.7,oop,Python,Python 2.7,Oop,我试图编写一个通用类,这样这个类(MLE)就可以调用一组具有类似函数(例如set_param(),fit())的子类(NormMLE,BinMLE) 调用fit()时,结果返回None 现在,我一定是误解了python中OOP的概念。当超类分别调用set_param()和fit()时,子类中的参数u、v和w(可选)似乎是不可访问的 我可以知道实现我想要的OOP的正确方法是什么吗?您的MLE.fit()方法返回None,因为它没有明确的return语句: def fit(self): se
MLE.fit()
方法返回None
,因为它没有明确的return
语句:
def fit(self):
self.mle.fit()
也许您想通过调用self.mle.fit()
传递结果
def fit(self):
return self.mle.fit()
更改后,输出将更改为:
Initialize NormMLE
1
2
2
Initialize BinMLE
1
2
3
6
除此之外,是的,您还没有正确理解OOP。你在这里没有继承权。您有包容。MLE
的实例包含不同类的实例,您希望该类实现特定方法(通常称为接口)。你实施了,;将实际工作委托给专门包含的对象的facade类
您可以创建文档并验证所需的接口:
from abc import ABCMeta, abstractmethod
class MLEImplBase(object):
__metaclass__ = ABCMeta
@abstractmethod
def set_param(self, param):
pass
@abstractmethod
def fit(self):
pass
class NormMLE(MLEImplBase):
# ...
class BinMLE(MLEImplBase):
# ...
严格来说,这不是必需的,但当您添加更多实现并意外拼写错误或忘记其中一个抽象方法时,这会很有帮助
但是,上面的代码确实使用了继承
MLEImplBase
是超类,NormMLE
和BinMLE
是子类。这里没有继承,没有超类或子类。你有遏制。
Initialize NormMLE
1
2
2
Initialize BinMLE
1
2
3
6
from abc import ABCMeta, abstractmethod
class MLEImplBase(object):
__metaclass__ = ABCMeta
@abstractmethod
def set_param(self, param):
pass
@abstractmethod
def fit(self):
pass
class NormMLE(MLEImplBase):
# ...
class BinMLE(MLEImplBase):
# ...