1. ホーム
  2. python

[解決済み] mixinとは何か、なぜ有用なのか?

2022-03-18 18:58:57

質問

で"。 プログラミングPython マーク・ルッツはミックスインについて言及しています。私はC/C++/C#の出身ですが、この言葉を聞いたことがありません。mixinとは何でしょうか?

の行間を読むと この例 (かなり長いのでリンクしました)、「適切な」サブクラス化とは対照的に、多重継承を使用してクラスを拡張しているケースだと推測されます。これは正しいのでしょうか?

新しい機能をサブクラスに入れるのではなく、なぜそのようなことをしたいのでしょうか?また、なぜコンポジションを使用するよりも、ミキシン・多重継承のアプローチの方が良いのでしょうか?

mixinと多重継承の違いは何ですか?セマンティクスの問題なのでしょうか?

どのように解決するのですか?

mixinは特殊な多重継承の一種です。 ミキシンが使われる場面は、主に2つあります。

  1. あるクラスに多くのオプション機能を提供したい場合。
  2. ある特定の機能を多くの異なるクラスで使用したい。

1の例として、次のように考えてみましょう。 WERKZEUGのリクエスト&レスポンス・システム . と言えば、平素からリクエストオブジェクトを作ることができる。

from werkzeug import BaseRequest

class Request(BaseRequest):
    pass

もし、acceptヘッダーのサポートを追加したい場合は、そのようにします。

from werkzeug import BaseRequest, AcceptMixin

class Request(AcceptMixin, BaseRequest):
    pass

もし私が、accept ヘッダ、etags、認証、ユーザーエージェントのサポートをサポートするリクエストオブジェクトを作りたかったら、こうすることができます。

from werkzeug import BaseRequest, AcceptMixin, ETagRequestMixin, UserAgentMixin, AuthenticationMixin

class Request(AcceptMixin, ETagRequestMixin, UserAgentMixin, AuthenticationMixin, BaseRequest):
    pass

微妙な違いですが、上記の例では、mixinクラスは独立させたものではありません。 より伝統的な多重継承では AuthenticationMixin (例えば) はおそらくもっと次のようなものでしょう。 Authenticator . つまり、このクラスは、おそらく、それ自体で自立するように設計されているのでしょう。