2017-08-16 15 views
-2

このクラス(MLE)が同様の機能を持つサブクラス(NormMLE、BinMLE)のセット(set_param()、fit()など)を呼び出すような汎用クラスを作成しようとしていますPythonスーパークラスがサブクラスを呼び出す

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 

ここで、私はOOPの概念がPythonで間違っているはずです。スーパークラスがset_param()とfit()を別々に呼び出した場合、サブクラスでパラメータw、v、およびオプションでwにアクセスできないようです...

OOPを達成する正しい方法がわかりますそうしたいです?

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

おそらく、あなたはself.mle.fit()コールからの結果を通過したかった:それは明示的なreturn文を持っていないので、

+3

ここに継承はありません。スーパークラスまたはサブクラスはありません。あなたは**封じ込め**を持っています。 –

答えて

1

あなたMLE.fit()方法はNoneを返しますか?その変更に伴い

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

、への出力の変更:それ以外

Initialize NormMLE 
1 
2 
2 
Initialize BinMLE 
1 
2 
3 
6 

、はい、あなたは正しくまだOOPを理解していません。ここには継承はありません。 封筒です。 MLEのインスタンスを含む異なるクラスのインスタンス。具体的なメソッド(多くの場合、インターフェイスと呼ばれます)を実装します。 Delegation Patternを実装しました。特殊な包含オブジェクトに実際の作業を委譲するFacadeクラス。

あなたは、ドキュメントにabstract base classを作成し、あなたが期待するインターフェイスを確認することができます:あなたは複数の実装を追加して、誤ってスペルを間違えたり、抽象メソッドのいずれかを忘れてしまったときに

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はスーパークラスであり、NormMLEBinMLEはサブクラスです。

関連する問題