4

今、私はパラメータオブジェクトのクラスを次のように継承するために使用しています

class A():
    def __init__(self,p1,p2):
        self.p1, self.p2 = p1, p2

class B(A):
    def __init__(self,b):
        self.p1, self.p2 = b.p1, b.p2

これにより、クラスコード自体ではなく、コードを使用するという不条理が解消されます。だから、私はC ++のことをして、パラメータオブジェクトを初期化リストに渡すようにしたいと思います

class A { 
    int p1,p2; 
}
class B : public A { 
    B(const A& a) : A(a) {} 
}

Pythonでこれを行うことはできますか?具体的には、親クラスを子のクラス内にあると呼び出すことで、親クラスの属性を設定でき__init__ますか?--「DiveintoPython」を読んでいると、オブジェクトが呼び出されるまでにオブジェクトがすでに構築されているので、これを実行できると思います__init__

または、Pythonでパラメーターオブジェクトリファクタリングを実装する別の方法がありますか(そして私はC ++テクニックを強制しようとしています)?

4

3 に答える 3

3

一般的に言えば、パラメータオブジェクトのリファクタリング手法はおそらく必要ありません。Pythonには、標準ライブラリにいくつかのコレクションがあり、パラメーターオブジェクトリファクタリングが提供するコアの利点がすでにあります。

さらに、パラメータオブジェクトデザインパターンのようなリファクタリングの費用便益分析は、C++とは著しく異なります。たとえば、静的コンパイルがないと、オブジェクトの作成とメンバーのルックアップははるかにコストがかかります。パラメータオブジェクトパターンの基本的なケースは、関連するフィールドの名前空間を提供することです。これは、Pythonで辞書を使用して簡単に実行できます。

グループ化されたデータに関連するメソッドの形で何らかのモデル操作が必要な場合、Pythonではパターンの価値が高くなりますが、それでも「プロパティ」のような単純で安価なメカニズムでメンバー属性の操作ニーズを解決できます。

問題空間についてもう少し詳しく説明すると、この種のリファクタリングがメリットであるかどうかを評価するのに役立つ可能性がありますが、Pythonで作業する場合は、そのデザインパターンを使用しない方がよいでしょう。

于 2010-01-03T17:46:52.900 に答える
2

C ++コードのPythonへの変換は、次のようになります。

class A():
    def __init__(self,p1,p2):
        self.p1, self.p2 = p1, p2

class B(A):
    def __init__(self,b):
        A.__init__(self, b.p1, b.p2)
于 2010-01-03T20:18:47.593 に答える
1
class B(A):
    def __init__(self, *args, **kwargs):
        super(B, self).__init__(*args, **kwargs)

詳細についてsuper()は、をご覧ください。

于 2010-01-03T17:39:39.110 に答える