[解決済み] Pythonはなぜ'マジックメソッド'を使うのか?
質問
最近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++などに存在)
- コンストラクタ/デストラクタ
- 属性にアクセスするためのフック
- メタプログラミングのためのツール
などなど...
関連
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonのリストメソッドであるappendとextendの違いは何ですか?
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] Pythonの静的メソッド?
-
[解決済み】if __name__ == "__main__": は何をするのでしょうか?
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み] Spyderを仮想環境で動作させるには?
-
[解決済み] Pythonの要素別タプル演算(sumなど
-
[解決済み] PythonからSMTPを使用してメールを送信する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Pythonのマルチプロセッシングプールimap_unorderedの呼び出しの進捗を表示しますか?
-
[解決済み] Jupyterノートブックでenv変数を設定する方法
-
[解決済み] 辞書のキーと値を交換するにはどうすればよいですか?
-
[解決済み] dict を txt ファイルに書き、それを読み取る?
-
[解決済み] Flaskで非同期タスクを作る
-
[解決済み] Python Empty Generator 関数
-
[解決済み] pycharmがタブをスペースに自動変換する
-
[解決済み] virtualenvsはどこに作成するのですか?
-
[解決済み] pipの依存性/必要条件をリストアップする方法はありますか?
-
[解決済み] Pythonで、メソッドの代わりに関数を使用するのはどんな場合ですか?