2017-02-22 3 views
1

別のクラスを継承するサブクラスNewDataStructureを定義しました。オブジェクト自体に作用するメソッドは、このサブクラスでうまく動作します。ただし、コピーを作成するメソッドは、サブクラスではなく親クラスのオブジェクトを返します。これは、他のメソッド内でそのメソッドを呼び出すときに、多くの問題を引き起こします。継承元の親クラスではなく、サブクラスが自身のコピーを返すようにするにはどうすればよいですか?

親クラスの名前付きメソッドがサブクラスのオブジェクトを返すように具体的に指示する方法はありますか?

継承されたすべてのメソッドが親クラスではなくサブクラスのオブジェクトを返すように指示する方法はありますか?

おそらく返されたオブジェクトを私のクラスの__init__関数に渡すことができますか?それに応じて__init__を修正する必要があります... Pythonicの方法は何ですか?

import pandas as pd 


class NewDataStructure(pd.DataFrame): 
    def __init__(self, data, index, title): 
     super(NewDataStructure, self).__init__(data=data, index=index) 
     self.title = title 


new_data_variable = NewDataStructure(data=None, index=None, title="") 

changed = new_data_variable.unstack() 

new_data_variable.reset_index(inplace=True) 
unchanged = new_data_variable 

print type(changed) 
print type(unchanged) 

<class 'pandas.core.series.Series'> 
<class '__main__.NewDataStructure'> 

答えて

7

私はあなたの質問が古典的なXY questionだと思うのですが、あなたはXの解決策であると考えるYをする方法を尋ねていますが、実際にはXにとっては素晴らしい解決策ではないでしょう。 Xへの別の解決策を試してみてください。

Xはおおよそ "DataFrameに余分な機能をバインドするのですか?"と説明しています。これについては、this questionで解説しています。サブクラス化の主な問題は、クラスの新しいインスタンスを生成するファクトリメソッドを持っていることですが、サブクラスから簡単に操作することはできません。

しかし、パンダコードを見ると、あなたが使用できるハックがあるようです。 DataFrame class defines a _constructor property:いうだけDataFrameよりインスタンスを作成するために使われているようです

class DataFrame(NDFrame): 
    ... 
    @property 
    def _constructor(self): 
     return DataFrame 

。だからサブクラスでそのプロパティをオーバーライドすることで、あなたの問題を解決できる場合があります

class NewDataStructure(pd.DataFrame): 
    ... 
    @property 
    def _constructor(self): 
     return NewDataStructure 

これは、ユーザーによって変更することができ、工場/コンストラクタメソッドにインスタンスの作成を延期する認識されたパターンです。ログモジュールの能力をlogging.setLoggerClass()でロガークラスに設定する機能と同様です。

しかし、これは私が言うことができる限り文書化されていないので、自己責任で行ってください。たとえそれがうまくいっても、長期的には、構成と継承についての詳細を読んで、構成ソリューションを試してみるほうがよいでしょう。

1

私は同じ問題がここで説明したと思う:Pandas DataFrame Object Inheritance or Object Use?

そしてソリューションとして、あなたはパンダのデータフレームのためのラッパークラスを作成する必要があります。

0

!!!私は小さなスマートフォンにいます!

コードを使用している場合は、関数の反復呼び出しを実装しています。

これまでのところ、new_variable_dataオブジェクトを作成したとお伝えできますが、pandasの一部でない限り、呼び出す関数が正しく設計されていない場合があります。毎回pdのために、再割り当てしてください。

引数として渡されたデータがnoneで渡される限り、ifステートメントも組み込んで、オブジェクトとしてデータをselfに割り当てたいとします。

私はあなたがしようとしていることをやっていると思います。クラスを少しだけredisgnして、オブジェクトデザインについて考える必要があります。

私は帰宅途中ですが、私がノートパソコンに乗ったときにこれを編集し、例を与えます 。

関連する問題