科学的なPythonパッケージをビルドしようとする中で、わかりやすくするために、主要な機能を別々の.pyファイルに分けることを目指しています。具体的には、あるモデルの複雑な数値計算を1つのpythonファイル(たとえば "processing.py")に分割し、別のpythonファイル( "plotting.py")に可視化するためのルーチンをプロットすることは論理的です。クラスは異なるファイルからメソッド(またはサブクラス)を継承できますか?これは "Pythonic"ですか?
モデルクラスは、すべてのプロット方法を継承し、ユーザーが簡単にアクセスできるようにする必要がありますが、科学的数値コードを視覚化コードから分離することにより、 。
これを達成するための私のビジョンを説明しますが、より良いOOPスタイルが利用可能な場合、これをPythonで実装する方法には苦労しています。 plotting.py、例えば
:
class ItemPlotter(object):
def visualisation_routine1(self):
plt.plot(self.values) # where values are to be acquired from the class in processing.py somehow
とprocessing.pyで:
次のコマンドラインの使用をもたらすclass Item(object):
def __init__(self, flag):
if flag is True:
self.values = (1, 2, 3)
else:
self.values = (10, 5, 0)
from plotting.py import ItemPlotter
self.plots = ItemPlotter()
:
from processing.py import Item
my_item = Item(flag=True)
# Plot results
my_item.plots.visualisation_routine1()
マイ実コードはこれよりも複雑になり、Itemは大きなデータセットの属性を持つ可能性があります私はメモリ効率のためにこれらをコピーしないようにする必要があります。
私のビジョンは可能ですか、Pythonのアプローチでさえどうですか? コメントがありません。 OOPやこれを達成するための効率的な方法が評価されます。
PS、私はPy2.7とPy3の互換性を目指しています。ジョンが指摘するように
これは継承もサブクラス化もされていません。それは*作成*です。もちろん、他の場所からのクラスのインスタンスを属性として使用することもできますが、インポートはファイルの先頭に置く必要があります。 – jonrsharpe
実例を教えてください。これを試してみると、私はAttributeErrorを取得します。 'ItemPlotter'オブジェクトには属性 'vales'がありません。ご協力いただきありがとうございます。 – IanRoberts
まあ...はい、そうです、そうではありません。もう、**あなたはサブクラス化していないから**。あなたは 'Item'のインスタンスの中に' ItemPlotter' **のインスタンスを持っていますが、それらは同じオブジェクトではありません( 'self'を共有しません)。おそらく、 'Item' *は' ItemPlotter'から継承しなければならないか、あるいはその逆です。 – jonrsharpe