2012-03-06 14 views
-1

A、B、Cがクラスであるとしましょう。 CはAとBから継承し、ミックスインとして利用します。Pythonでのmixinsの適切な使用

この時点で、Aはself.whateverを通じてBとCの任意の属性にアクセスできます。 Bはself.whateverを通じてAとCの任意の属性にアクセスできます。そして、Cはself.whateverを通してAとBのどんな属性にもアクセスできます。

Pythonでこの「混合」パターンを使用するときに他者とやりとりする方法を「知っている」べきであるか、あるいはコンセンサスがありますか?例えば、CはA/Bの機能を利用するだけですが、その逆はできません。あるいは、A/BはCの機能のみを利用するべきですが、その逆はできませんか?

EDIT - これは別の著者から継承したコードです。説明は、Pythonでmixinパターンを使用する場合、これは受け入れ可能な設計です。皆さんはそうではないことを確認しました。コメントの中で以下に述べたように、私はこのようにオブジェクト指向設計について決して行きません。私はコードをリファクタリングします。私は、私が理解できなかった "ミックスイン"パターンについての何かがあった可能性に気づきました。また、ダウン票に感謝します。

+0

あなたは、Pythonのクラスがどのように機能するかについて真剣に混乱しているようです。あなたのクラス間のアクセスの例は本当に意味をなさない。 – Marcin

+0

"ミックスイン"はPythonには存在しません(構文構造として、パターンはコードで実装できます)。それはまっすぐ継承です。 –

+0

@Marcin、私が上で述べたことは*技術的には機能しますか?これは私が書いたコードではなく、私が理解していないようなPythonで使用されているミックスインパターンがあるので、著者に疑念の恩恵を与えようとしています。私が上に挙げたもののいくつかの部分を技術的にも可能ではなく、たとえそれがあったとしても、それは恐ろしいオブジェクト指向の設計になるでしょう。私はそれを整えるためにコードをリファクタリングします。 –

答えて

0

それ自体でインスタンス化することはできますか?可能であれば、それはCに依存してはいけません.B上のC.のために一般化として、インスタンス化可能なクラスはそれ自身とそのスーパークラスのみに依存し、決してサブクラスはありません。

スーパークラスがそのサブクラスについて知る必要がある場合がありますが、これは(一般的に望ましくない)カップリングのためにおそらく設計が不良であることを示すものです。

+1

さらに悪いことに、「B」が質問に示唆されているように、「A」の機能に依存するかどうかです。これらの2つのクラスは共通して*何もありません。共通のサブクラスを介して接続するのはむしろ偶然です。 –

+0

完全合意。私が見ているコードベースでは、A、B、Cは本当に1つのクラスとして定義されている可能性があります。彼らが分かれた唯一の理由は、気楽なファイルを避けることでした。 AとBはCによって継承されるミックスインであると考えられます。いくつかのベースAとBはお互いに依存していて、あなたが言うように、これはちょうど間違っていると感じます。サブクラス化され、そのサブクラスで機能を使用することによって、AおよびBよりもさらに間違っています。これは奇妙なデザインです、私はそれをリファクタリングします。 –

+0

あなたの質問に答えるために、コードの作成者は、A自身がインスタンス化されることを決して意図していませんでした。 –