でPythonプログラミング、Mark Lutz はmixinという用語に言及しています。私は C/C++/C# のバックグラウンドを持っていますが、この用語は聞いたことがありません。mixin とは何ですか?
行間を読むこの例(かなり長いのでリンクしています)、適切なサブクラス化ではなく多重継承を使用してクラスを拡張するケースだと推測しています。これで正しいでしょうか?
新しい機能をサブクラスに入れるのではなく、なぜそうしたいのでしょうか? さらに言えば、ミックスイン/多重継承のアプローチがコンポジションを使用するよりも優れているのはなぜでしょうか?
ミックスインと多重継承を区別するものは何ですか? それは単なる意味論の問題ですか?
ベストアンサー1
ミックスインは特別な種類の多重継承です。ミックスインが使用される主な状況は 2 つあります。
- クラスに多くのオプション機能を提供したい。
- 1 つの特定の機能をさまざまなクラスで使用したい場合。
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
違いは微妙ですが、上記の例では、ミックスイン クラスは独立して動作するようには作成されていません。より伝統的な多重継承では、AuthenticationMixin
(たとえば) はおそらく のようなものになりますAuthenticator
。つまり、クラスは独立して動作するように設計されることになります。