1. ホーム
  2. python

[解決済み] Pythonはなぜ'マジックメソッド'を使うのか?

2022-11-12 02:31:53

質問

最近Pythonで遊んでいて、ちょっと変だなと思ったのは、「マジックメソッド」の多用です。例えば、長さを利用可能にするために、オブジェクトはメソッドを実装します。 def __len__(self) と書くと、それが呼び出されます。 len(obj) .

私は、なぜオブジェクトが単に len(self) メソッドを定義し、それをオブジェクトのメンバーとして直接呼び出すようにしないのか、 例えば obj.len() ? Pythonがこのような方法をとるのには、きっと良い理由があるのでしょうが、初心者の私はまだそれが何なのかわかっていません。

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

AFAIK len はこの点で特別であり、歴史的なルーツを持っています。

以下は引用です。 をFAQから引用します。 :

<ブロッククオート

なぜPythonはいくつかの機能(例えばlist.index()等)にメソッドを使うのに (例: list.index())に対してメソッドを使用し、他の機能(例: len(list))に対して 関数を使うのでしょうか?

大きな理由は歴史です。関数 が使われていたのは ある種の型に対して汎用的で メソッドを持たないオブジェクトでも動作するように メソッドを持たないオブジェクト タプルなど)でも動作するように意図されていました。また を容易に適用できる関数があると便利です。 を使うとき、非定形のオブジェクトの集まりに簡単に適用できる関数があると便利です。 また、Pythonの関数型機能(map()、map())を使うときに Pythonの関数機能(map(), apply()など)を使うときにも便利です。

実際、len(), max(), min() を組み込み関数として実装することは を実装することは、それぞれの型のメソッドとして実装するよりも をそれぞれの型のメソッドとして実装するよりも少ないコードです。個々のケースについて 個々のケースについてとやかく言うこともできますが Pythonの一部であり、このような根本的な変更を行うには遅すぎます。 このような根本的な変更を行うには遅すぎる 今更です。大規模なコード破壊を避けるために、関数は残さなければならないのです。 大規模なコード破壊を避けるために、関数は残らなければなりません。

その他の "魔法のメソッド" (実際には スペシャルメソッド は多くの意味を持ち、他の言語にも似たような機能が存在します。これらは主に、特別な構文が使用されたときに暗黙的に呼び出されるコードのために使用されます。

たとえば

  • オーバーロードされた演算子(C++などに存在)
  • コンストラクタ/デストラクタ
  • 属性にアクセスするためのフック
  • メタプログラミングのためのツール

などなど...