1

シナリオ

クラスのインスタンスをデータファイルに保存し、後で再度ロードできるようにするオブジェクト指向のアプローチをPythonで探しています。私の現在のアプローチは次のようになります。

class A(object):
    def __init__(self, ComplexParam1, ComplexParam2):
        self.ComplexParam1 = ComplexParam1
        self.ComplexParam2 = ComplexParam2

    @staticmethod
    def Create(EasyParam1, EasyParam2):
        #do some complex calculation to get ComplexParam1 and ComplexParam2 from EasyParam1 and EasyParam2
        return A(ComplexParam1, ComplexParam2)        

    def Save(self, Filename):
        #write ComplexParam1 and ComplexParam2 to disc

    @staticmethod
    def Load(Filename):
        #read ComplexParam1 and ComplexParam2 and call constructor
        return A(ComplexParam1, ComplexParam2)

ご覧のとおりComplexParam1、 およびは計算されるパラメータであり、取得が非常に複雑なためComplexParam2、オブジェクトの最初の作成には使用されませんが、およびは「既知の」パラメータです。あたかもが整数で、がに基づいて構築された大きな行列であるかのように考えてください。AEasyParam1EasyParam2EasyParametersComplexParametersEasyParameters

したがって、上記のセットアップを使用して、ファイルとの間SaveLoadオブジェクトをやり取りしています。ここでCreateは、コンストラクターを使用して以来ComplexParam1ComplexParam2ファイルに保存されているため、再度計算する必要はありません。

問題

これまで、上記のアプローチは私にとってはうまく機能していました。ただし、このスキームがクラス継承でも使用される場合、問題が発生します。だから私は私の問題に対するより良くてきれいな解決策を探しています。

C++ では、コンストラクターをオーバーロードして、クラスの 2 つの作成を可能にしますが、これは Python ではサポートされていません。

ヘルプ、リンク、提案は大歓迎です。

4

2 に答える 2

1

@classmethodこれはデコレーターの場合だと思います。たとえば、Loadメソッドを次のように変更するとします。

    @classmethod
    def Load(cls, Filename):
        # Do stuff
        return cls(ComplexA, ComplexB)

次に、コンストラクターをオーバーライドできます。

class B(A):
    def __init__(self, complexA, complexB):
        # Whatever you want, including calling the parent constructor

B.Load(some_file)最後に、 which を呼び出すと、 を呼び出すことができますB.__init__

于 2013-02-01T09:16:46.267 に答える
0

オーバーロードは必要ありませんclassmethod。代わりのコンストラクター メソッドに a を使用するだけです。この質問とその回答を見てください。

class A (object):

    @classmethod
    def Load(cls, Filename):
        #read ComplexParam1 and ComplexParam2 and call constructor
        return cls(ComplexParam1, ComplexParam2)

クラスに cls パラメーターを使用することで、継承とうまく連携します。

于 2013-02-01T09:17:05.697 に答える