我正在尝试编写一个通用类,这样这个类(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的正确方法是什么?
答案 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
是超类,BinMLE
和SELECT * FROM [tablename] INTO #temptable
是子类。