4

複数のクラスにいくつかの同一のメソッドを追加する最もpythonicな方法は何ですか?


クラス デコレータを使用することもできますが、かなり複雑になり、他の方法よりも読み書きが難しくなるようです。

すべてのメソッドを含む基本クラスを作成し、他のクラスに継承させることもできますが、一部のクラスでは、多重継承を許可したくなります。これは、頻繁に読んだことですが、回避または最小化する必要があります。また、「is-a」関係は適用されません。

また、それらをメソッドから変更して、ダックタイピングによって値が適切なプロパティを提供することを期待するスタンドアロン関数にすることもできます。これはいくつかの点でクリーンですが、オブジェクト指向ではなく、そのタイプのオブジェクトで関数を使用できるタイミングが明確ではありません。

委任を使用することもできますが、これには呼び出したいすべてのクラスが、ヘルパー クラス メソッドを呼び出すメソッドを持っている必要があります。これにより、コード ベースが他のオプションよりもはるかに長くなり、新しい関数をヘルパー クラスに追加するたびにデリゲートするメソッドを追加する必要があります。

あるクラスに別のクラスのインスタンスを属性として与えると、場合によってはうまく機能することはわかっていますが、常にきれいに機能するとは限らず、そうでない場合よりも呼び出しが複雑になる可能性があります。

少し遊んだ後、多重継承につながる場合でも、継承に傾いています。しかし、複数の継承を許可することに対して非常に強く警告する多くのテキストと、このようなコードの再利用のためだけに継承を最小限に抑える必要があるとまで言っている ( wikipediaのエントリなど) ため、私は躊躇しています。


これは、例を使用するとより明確になる可能性があるため、単純化した例として、すべてが x、y グリッド上に位置する多数の異なるクラスを扱っているとします。2 つのエンティティ間の距離、相対方向、それらの間の中点などを取得するメソッドなど、x、y 位置を持つすべてのメソッドを作成したい操作がたくさんあります。

x と y を属性として持つことだけに依存するこれらのメソッドへのアクセスをすべてのそのようなクラスに与える最も Pythonic な方法は何でしょうか?

4

2 に答える 2

2

この問題には、昔ながらの関数が最適です。たとえば、これの代わりに...

class BaseGeoObject:

  def distanceFromZeroZero(self):
    return math.sqrt(self.x()**2 + self.y()**2)
  ...

...このような機能があります:

def distanceFromZeroZero(point):
  return math.sqrt(point.x()**2 + point.y()**2)

テストも簡単であるため、これは優れたソリューションです。特定の機能を実行するためだけにサブクラス化する必要はありません。

于 2012-10-19T22:21:13.200 に答える