例によってPythonのマジックメソッド

画像礼儀www..com

マジックメソッドを使用して組み込みの動作を変更する

マジックメソッドは、クラスに’マジック’を追加するために定義 例えば、__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で実装されているこれらのマジックメソッドを使用するためのガイドは、下の表に指定されています。

How to call the magic methods, getitem, setitem and delitem

Example 2: __Mul__マジックメソッド

クラス設計で乗算演算子を使用することもできます。 組み込みのlistクラスから継承するため、2つのMyCustomListオブジェクトを一緒に圧縮し(listオブジェクトのように機能するため)、zipオブジェクトを反復処理 反復中に、各リストの要素に、ブロードキャスト形式で他のリストの対応する要素を乗算することができます(以下の__mul__マジックメソッドのコードスニペット このブロードキャストの動作は、PandasやNumpyなどのデータ解析パッケージに見られる動作と似ています。

この例では、*記号を使用して2つのMyCustomListオブジェクトを複数同時に使用できることを示しています。 戻り値をlist_threeという変数にキャプチャし、list_threeを印刷すると、新しいリストが出力されます。 このリストは、他の2つのリストから要素を互いに掛け合わせたものです。p>

__mul__はMyCustomListクラスのメソッドです。 ここでは、単独で示されている。div>

乗算演算子*は__mul__マジックメソッド呼び出しに解決され、これは私たちが望む動作を返すようにカスタマイズすることができます。

この例で使用されているクラスのソースコード全体、MyCustomListを以下に示します。

ボーナス例: 最後に、Pythonの__call__マジックメソッドをどのように呼び出すことができるかを説明します。 __call__は、状態を頻繁に変更する必要があるインスタンスを持つクラスで特に便利です。 インスタンスを”呼び出す”ことは、オブジェクトの状態を変更するための直感的でエレガントな方法です。

示されている例を考えてみましょう。 ここで、クラスMyClassには、3つの引数が渡されることを期待するinitコンストラクタがあります。 これらの3つの引数は、initメソッドのシグネチャで渡され、オブジェクトの属性として割り当てることができます。call magicメソッドは、実際に新しいインスタンスを作成せずにインスタンスの状態を変更したい場合に便利です。インスタンスが最初に初期化されると、インスタンス内の属性var_1、var_2、およびvar_3としてそれぞれ割り当てられた整数1、2、および3を渡します。 Print文を使用して、__dict__属性を使用してインスタンスobjの出力を表示すると、var_1に値1が割り当てられ、var_2に値2が割り当てられ、var_3に値3が割り当ここで、このインスタンスのvar_1およびvar_2属性値を変更し、インスタンスが最初に構築されたときのvar_3属性を維持することを提案しましょう。これを行うには簡単です。

私は、var_1とvar_2属性を再定義できるcall magicメソッドを定義します。 つまり、単にobj(200、300)を呼び出すだけで、callメソッドが呼び出されます。 もちろん、callメソッドを明示的に呼び出すこともできます。obj。__call__(200,300)ですが、最初のメソッドはより直感的です。 最後に、デモ目的のために、同じオブジェクトを操作したことを確実に示すためにインスタンスのidを印刷しました。p>

呼び出しメソッドを定義することができます二つの方法で。 引数は、callメソッドシグネチャに直接渡すことができます。 または、*vars引数を使用して、渡されたすべての引数をキャプチャし、それらをタプルに格納することができます。

この例のソースコードは以下の通りです。…..

Summary

マジックメソッドは、コア構文機能にアクセスできるようにすることで、クラス設計 最初の例では、私たちは両方の世界の最高を持っています。 組み込みのlistクラスから継承し、そのクラスの特定のメソッドを変更して動作をカスタマイズできます。 getitem、setitem、およびdelitemはすべて変更されましたが、継承を通じて、リストの組み込みinitおよびrepr()メソッドを使用することができました。

私たちは、仲間の開発者に非常に簡単にオブジェクトの使用を伝えることができます。 提供された例では、私たちの仲間の開発者に伝える必要があるのは、私たちのクラスがリストのように動作するということだけです。 新しいメソッド名や新しいインターフェイスを学ぶ必要はありません。

さらに、call magicメソッドが実証されました。 インスタンスを呼び出すことは、オブジェクトの状態を変更するための直感的でエレガントな方法です。

コメントを残す

メールアドレスが公開されることはありません。