Python超类调用子类

时间:2017-08-16 06:45:56

标签: python python-2.7 oop

我正在尝试编写一个通用类,这样这个类(MLE)调用一组具有类似功能的子类(NormMLE,BinMLE)(例如set_param(),fit())

class MLE:
    def __init__(self, mclass):
        self.mle = mclass()

    def set_param(self, param):
        self.mle.set_param(param)

    def fit(self):
        self.mle.fit()

class NormMLE():
    def __init__(self):
        print "Initialize NormMLE"
        self.u = 0
        self.v = 0

    def set_param(self, param):
        self.u = param[0]
        self.v = param[1]
        print self.u
        print self.v

    def fit(self):
        return self.u*self.v

class BinMLE():
    def __init__(self):
        print "Initialize BinMLE"

    def set_param(self, param):
        self.u = param[0]
        self.v = param[1]
        self.w = param[2]
        print self.u
        print self.v
        print self.w        

    def fit(self):
        return self.u + self.v + self.w

nmle = MLE(NormMLE)
nparam = [1,2]
nmle.set_param(nparam)
print nmle.fit()

bmle = MLE(BinMLE)
bparam = [1,2,3]
bmle.set_param(bparam)
print bmle.fit()

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

Initialize NormMLE
1
2
None
Initialize BinMLE
1
2
3
None

现在,我必须在python中得到OOP的概念错误。当超类分别调用set_param()和fit()时,子类中似乎无法访问param u,v和w;

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

1 个答案:

答案 0 :(得分:1)

您的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

通过该更改,输出将更改为:

MLE

除此之外,是的,你还没有正确理解OOP。你这里没有继承权。您有遏制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): # ... 的实例包含不同类的实例,您希望实现特定方法的实例(通常称为接口)。您已实施Delegation Pattern;一个facade类,它将实际工作委托给一个专门的包含对象。

您可以创建abstract base class来记录和验证您期望的界面:

MLEImplBase

这不是绝对必要的,但是当您添加更多实现并意外拼写错误或遗忘其中一种抽象方法时,这会很有用。

但是,上面的 使用继承。 NormMLE是超类,BinMLESELECT * FROM [tablename] INTO #temptable 是子类。