2

私はPHPアプリケーションを作成しましたが、PHPではうまく解決できない問題があります。そこで、RubyまたはPythonに移植することを考えています。これまで使用したことのない2つの言語です。私が見た限りでは、この問題はRubyで解決できます。私の質問は、Pythonでも解決できるかどうかです。

アプリケーションのコアには、拡張したいクラスAがあります。メソッドdoFooによってAを拡張する1つの拡張E1と、メソッドdoBarによってAを拡張する1つの拡張E2があります。ここで、A、E1、またはE2のコードを変更せずに両方の拡張機能を使用したいと思います。PHPでは、これは3番目の拡張機能E3を作成することでアーカイブできます。これは、Aを拡張し、E1とE2を特性と混合するクラスBを提供するか、その他の汚いトリックです。しかし、私はコアを持ち、これらの2つの拡張機能を持ち、構成に情報を持ちたいと思っています:「拡張機能E1とE2を使用する」すべてをまとめるクラスをこれ以上必要とせずに(そして__call()を使用せずに) )。

Pythonでそれはどうにか可能ですか?実行時に変更できるプロトタイプは本当に必要ありません。Aのすべてのインスタンスには、doFooとdoBarが必要です。

編集:すべてが拡張機能なしで、E1のみ(E2なし)、E2のみ(E1なし)、および両方の拡張機能で機能するはずです。

4

2 に答える 2

2

mailsonが示唆したように、多重継承が進むべき道です。シンプルな

class E(A, E1, E2):
    ...

あなたが必要なことをする必要があります。

編集:動的にそれを行うには、次のタイプを使用できます:

E = type("E", (A, E1, E2), {})

EDIT2:ダガルはそれに私を打ち負かした:D

于 2012-07-30T16:45:41.833 に答える
1

次のようにハードコーディングせずに、提案された多重継承を実行できます。

mixins = (E1, E2)
E = type('E', (A,) + mixins, {})

それはやっているようなものです

class E(A, E1, E2):
    pass

ただし、ミックスインを動的に指定できます。

于 2012-07-30T18:07:02.393 に答える