2016-07-25 5 views
0

私はPythonとOOプログラミングでは新しいので、次の質問が意味をなさないかどうかわかりません:...別のクラスの特定のクラスで生成されたデータの使用方法は? (Pythonで)

I ' 2つのクラスを持っています。データを生成するもの(DataGen()と呼ぶ)と、このデータを処理して統計情報を与えるもの(Stats()と呼んでください)。私は、それをよりきれいに保つために、異なるpyファイルに両方を入れたいので、DataGen.pyに触れることなくStats.pyにメソッドを追加できます。このような何か:ここでは今

class Stats(object): 
    def __init__(self, something): 
     # something here to initialize 
     # etc.. 
    def mean(self): 
     # calculate the mean using something like DataGen.X 

Stats.py


DataGen.py

class DataGen(object): 
    def __init__(self, number_of_samples, arg2): 
     self.X = np.zeros([number_of_samples,1]) 
     # etc.. 
    def samples(self): 
     # do some sampling and save it in self.X 

では、と私は迷子に一部付属しています。私はStats()DataGen()のインスタンスに属するデータを処理したいと思っていますが、DataGen.Xに含まれるデータをStatsにリンクする方法がわからないので、DataGen.samples()でサンプリングするたびにデータを使用できます。

DG = DataGen(arg1,arg2)のインスタンスを作成し、このオブジェクトをS = Stats(DG)に渡そうとしました。しかし、私がこの方法で初期化すると、DataGen.samples()で再びサンプリングした後に統計を推定するために使用されたデータは変更されませんでした。私はサンプリングするたびに、私は新しいデータでインスタンスS = Stats(DG)を作成しなければならないと思います。これは悪いようです...とにかく私はこのStats()クラスをDataGen()のデータに添付できますか?これは悪い考えか恐ろしい構造ですか?

DataGenがStatsのメソッドなどを継承するものを構築すると、これについてどう考えなければならないかもわかりません。 DataGenStatsから継承されていて、StatsのデータにDataGenのデータが必要な場合は、どうすればこのループを解決できますか? StatsDataGenから継承する場合は、の代わりにStats.DataGen.samples()またはStats.samples()のようにStatsのインスタンスを1つ作成してサンプルする必要があります。私のコードの残りの部分はDataGen()を使用しているので、私はそれが好きではないでしょう。私はそれを使用しないと、より良い構造になっていると思います。Stats()サンプル!

上記は意味がありますか?これに関するコメントはとても役に立ちます!

+0

コンストラクタでDatagenオブジェクトを渡してから、それを表示する必要があるデータセットオブジェクトの内部値を変更する.samples()を実行すると、pandasライブラリ...(http://pandas.pydata.org/) – pez

+0

を確認します統計クラスではあなたの統計を再実行する必要があります。あなたは、統計情報のコンストラクタでdatagenを渡したコードを表示できますか?それがうまくいかない場合は問題があると思います。あなたのOOPの理解は上手く見える – Hani

答えて

0

PythonとOOを初めて使う人にとっては、カプセル化がうまくいっています。 Observer patternここには、あるオブジェクトがいくつかの情報(DataGen)を所有し、他のオブジェクトがその情報(Stats)に興味があり、変更されたときに更新されたい場所があります。

これを行う方法は、関心オブジェクトの関数を所有者オブジェクトに渡すことです。このオブジェクトは、その情報が変更されたときに呼び出すことができます。関数は、コールバックまたはリスナーのいずれかと呼ばれます。ここ

class DataGen(object): 
    def __init__(self, number_of_samples, arg2): 
     self.X = np.zeros([number_of_samples,1]) 
     self.listeners = list() 

    def samples(self): 
     # do some sampling and save it in self.X 
     # Call back to the listener and let it know that your samples changed. 
     for listener in self.listeners: 
      listener.samples_changed(self.X) 

    def add_listener(self, listener): 
     listeners.append(listener) 

class Stats(object): 
    def __init__(self, data_gen): 
     # Register this 'observer' with the 'observable' 
     something.add_listener(self) 

    def samples_changed(self, samples): 
     # Recalculate mean. 

    def mean(self): 
     # calculate the mean using something like DataGen.X 

は、別のオブジェクトのリスナーとしてそれ自体を追加するオブジェクトの一例です。

  1. 統計あなたは、そのリスナーのすべてをsamples()samples()
  2. DataGenに反復処理を呼び出し(複数の統計が存在してもよい)と渡し、それぞれ一方 samples_changed(self.X)を呼び出し DataGen
  3. とリスナーとして自身を登録します新しいサンプルセット。
  4. これらのリスナーの1つ(この場合は唯一のもの)はStatsで、新しいサンプルを処理するために内部状態を更新できます。

いくつかの時点で、あなたがDataGen.listenersリストから削除することを確認する必要がありStatsオブジェクトを削除したい場合は、そうでなければ、メモリリークとなってしまいます。

関連する問題