Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python超类调用子类_Python_Python 2.7_Oop - Fatal编程技术网

Python超类调用子类

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)就可以调用一组具有类似函数(例如set_param(),fit())的子类(NormMLE,BinMLE)

调用fit()时,结果返回None

现在,我一定是误解了python中OOP的概念。当超类分别调用set_param()和fit()时,子类中的参数u、v和w(可选)似乎是不可访问的

我可以知道实现我想要的OOP的正确方法是什么吗?

您的
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):
    # ...