マジックメソッドを使用して組み込みの動作を変更する
マジックメソッドは、クラスに’マジック’を追加するために定義 例えば、__init__や__str__のように、常に二重のアンダースコアで囲まれています。 マジックメソッドは、Pythonの組み込み構文機能にアクセスできるようにすることで、クラス設計を豊かにすることができます。
Pythonは、私たちのクラスが組み込みクラスから継承することができます。 ビルトインの継承する子クラスは、ビルトインとメソッドを含むすべての同じ属性を共有します。 コアの組み込み機能を利用することはできますが、魔法の方法を使用して選択した操作をカスタマイズすることができます。
このチュートリアルでは、これら二つのアイデアを結び付けて、組み込みのlistクラスから継承し、クラス設計で魔法のメソッドを使用する方法を紹介 私はリストの索引付けを制御する三つの魔法の方法を変更します。 これらの両方の機能を組み合わせることで、非常に使いやすいクラスを構築することができ、必要なメソッドに動作を追加することができます。 組み込みの動作はすべてのPython開発者にはよく知られています;これにより、継承するクラスを簡単に使用できます。
最後に、マジックメソッドがブロードキャスト操作でどのように使用され、インスタンスの状態を変更できるかを示す2つのより広範な例を示 付随するすべてのコードはGitHubから入手できます。
例1: リストインデックス
魔法のメソッドは、リストインデックスを変更するために操作することができます。 クラスMyCustomListは、組み込みのリスト型を継承します。 つまり、MyCustomListクラスを使用して作成されたオブジェクトは、メソッドを選択的にカスタマイズする場所を除いて、リストのように動作します。getitem、setitem、およびdelitemは、リストインデックスにアクセスするときに呼び出される魔法のメソッドです。 これらのマジックメソッドの動作を変更することができます。
以下に表示される例では、ゼロのインデックスから始まるリストインデックスのアイデアを破棄しています。 ユーザーがゼロのインデックスを使用してリストから要素にアクセスしようとすると、ValueError例外が発生し、プログラムは終了します。 ユーザーが1より大きいリストインデックスを入力すると、メソッドはインデックスを1つ減らし、インデックスを持つ親クラスリストを呼び出します。
MyCustomListクラスで定義されたこれらのメソッドがどのように使用されているかを紹介するには、Python対話型プロンプトの下を参照してください。etItem、SetItem、およびDelItemを呼び出すことができます。 マジックメソッドは暗黙的に呼び出すことができます。 __Getitem__の場合、最初のインデックスにアクセスするには、オブジェクトの名前の後にインデックスの位置を角かっこで囲んで記述します。
最も興味深いのは、インデックス位置1の要素を要求すると、1が0番目の要素であっても整数値1が返されることです。 私たちがここに持っているのは、1から始まるインデックス付けを開始するリストです。 実際、それは私たちが最初にリストの索引付けを学んだときに私たち全員が持っていた混乱を補っています。ここで、リスト内の整数値1を100に変更しましょう。 これを行うには、setitemを呼び出す必要があります。 これを行うには、単純にオブジェクトの名前を書き、その後に角括弧と割り当てを付けます。 ここでも、リストの最初の要素を変更するには、インデックス位置1を使用します。 リストを再度出力すると、最初の要素が1から100に変更されていることが明確にわかります。
最後に、リストから要素を削除するには__delitem__を定義することができます。 __Delitem__メソッド呼び出しに解決されるdel pythonキーワードを使用すると、__delitem__マジックメソッドが呼び出されます。 リストのインデックス作成の例をさらに構築するために、インデックスの最初の要素である整数値100を削除します。 Delを呼び出し、その後にオブジェクトと削除したい要素のインデックス位置、この例ではリスト100の最初の要素を呼び出すと、100が実際に削除された
魔法のメソッドは、デフォルトの動作を変更する機会を提供します。 何よりも、新しいメソッド名や新しいインターフェイスを学ぶ必要はないので、メソッドを直感的に実装することができます。 MyCustomListで実装されているこれらのマジックメソッドを使用するためのガイドは、下の表に指定されています。
Example 2: __Mul__マジックメソッド
クラス設計で乗算演算子を使用することもできます。 組み込みのlistクラスから継承するため、2つのMyCustomListオブジェクトを一緒に圧縮し(listオブジェクトのように機能するため)、zipオブジェクトを反復処理 反復中に、各リストの要素に、ブロードキャスト形式で他のリストの対応する要素を乗算することができます(以下の__mul__マジックメソッドのコードスニペット このブロードキャストの動作は、PandasやNumpyなどのデータ解析パッケージに見られる動作と似ています。
この例では、*記号を使用して2つのMyCustomListオブジェクトを複数同時に使用できることを示しています。 戻り値をlist_threeという変数にキャプチャし、list_threeを印刷すると、新しいリストが出力されます。 このリストは、他の2つのリストから要素を互いに掛け合わせたものです。p>