
Python のあまり知られていないが価値のある機能の 1 つは、オブジェクトに魔法のメソッドを実装する機能です。 魔法の方法を使用すると、直感的で理解しやすい、よりクリーンなコードを記述できます。
マジック メソッドを使用すると、より Python らしい方法でオブジェクトとやり取りするためのインターフェイスを作成できます。 この記事では、魔法のメソッドを紹介し、それらを作成するためのベスト プラクティスについて説明し、遭遇する一般的な魔法のメソッドを調べます。
魔法のメソッドとは?
マジック メソッドは、Python オブジェクトで一般的な操作が実行されたときの Python オブジェクトの動作を定義する Python メソッドです。 これらのメソッドは、メソッド名の前後に 2 つの下線を付けることで明確に定義されます。
その結果、それらは一般的に二重アンダースコアのように dunder メソッドと呼ばれます。 すでに遭遇している可能性のある一般的なメソッドは、クラス コンストラクターの定義に使用される __init__() メソッドです。
通常、dunder メソッドはコード内で直接呼び出されることを意図していません。 むしろ、プログラムの実行中にインタープリターによって呼び出されます。
魔法のメソッドが役立つのはなぜですか?
マジック メソッドは、Python のオブジェクト指向プログラミングで役立つ概念です。 これらを使用して、カスタム データ型が一般的な組み込み操作で使用されるときの動作を指定します。 これらの操作は次のとおりです。
🟢算術演算
🟢 比較操作
🟢 ライフサイクル操作
🟢 表現操作
次のセクションでは、上記のすべてのカテゴリで使用されたときにアプリケーションがどのように動作するかを定義するマジック メソッドを実装する方法について説明します。
マジック メソッドの定義方法
前述のように、マジック メソッドはオブジェクトの動作を指定します。 そのため、それらはオブジェクトのクラスの一部として定義されます。 これらはオブジェクト クラスの一部であるため、最初の引数として、オブジェクト自体への参照である self を受け取ります。
インタープリターによる呼び出し方法に応じて、追加の引数を受け取ることができます。 また、名前の前後に 2 つのアンダースコアを付けることで明確に定義されます。
実装
これまで議論してきたことの多くは、理論的で抽象的なものに思えます。 このセクションでは、単純な Rectangle クラスを実装します。
このクラスには、長さと幅のプロパティがあります。 __init__ メソッドを使用すると、インスタンス化時にこれらのプロパティを指定できます。 さらに、==、<、および > 演算子を使用して、異なる四角形を比較して、他の四角形と等しいか、小さいか、または大きいかを確認できます。 最後に、長方形は意味のある文字列表現を提供できる必要があります。
コーディング環境のセットアップ
このチュートリアルを進めるには、Python ランタイム環境が必要です。 ローカルのものを使用するか、オンラインの etechjp.com Python コンパイラーを使用できます。
Rectangle クラスの作成
まず、Rectangle クラスを定義することから始めましょう。
class Rectangle: pass
コンストラクター メソッドの作成
次に、最初のマジック メソッドであるクラス コンストラクター メソッドを作成しましょう。 このメソッドは、高さと幅を受け取り、それらをクラス インスタンスの属性として格納します。
class Rectangle: def __init__(self, height, width): self.height = height self.width = width
文字列表現のマジック メソッドの作成
次に、オブジェクトを表す人間が読める文字列をクラスが生成できるようにするメソッドを作成します。 このメソッドは、Rectangle クラスのインスタンスを引数として渡す str() 関数を呼び出すたびに呼び出されます。 このメソッドは、print 関数など、文字列引数を必要とする関数を呼び出すときにも呼び出されます。
class Rectangle: def __init__(self, height, width): self.height = height self.width = width def __str__(self): return f'Rectangle({self.height}, {self.width})'
__str__() メソッドは、オブジェクトを表す文字列を返す必要があります。 この場合、Rectangle(
比較操作のためのマジック メソッドの作成
次に、等号、小なり、大なりの比較演算子を作成します。 これは、演算子のオーバーロードと呼ばれます。 これらを作成するには、魔法のメソッド __eq__、__lt__、および __gt__ をそれぞれ使用します。 これらのメソッドは、長方形の面積を比較した後、ブール値を返します。
class Rectangle: def __init__(self, height, width): self.height = height self.width = width def __str__(self): return f'Rectangle({self.height}, {self.width})' def __eq__(self, other): """ Checking for equality """ return self.height * self.width == other.height * other.width def __lt__(self, other): """ Checking if the rectangle is less than the other one """ return self.height * self.width < other.height * other.width def __gt__(self, other): """ Checking if the rectage is greater than the other one """ return self.height * self.width > other.height * other.width
ご覧のとおり、これらのメソッドは 2 つのパラメーターを取ります。 1 つ目は現在の四角形で、2 つ目は比較対象の他の値です。 この値は、別の Rectangle インスタンスまたはその他の値にすることができます。 比較のロジックと比較が true を返す条件は、完全にあなた次第です。
一般的な魔法の方法
この次のセクションでは、遭遇して使用する一般的な魔法の方法について説明します。
#1。 算術演算
算術マジック メソッドは、クラスのインスタンスが算術記号の左側に配置されたときに呼び出されます。 メソッドは 2 つの引数で呼び出されます。最初の引数はインスタンスへの参照です。 2 番目の値は、記号の右側にあるオブジェクトです。 方法と記号は次のとおりです。
NameMethodSignDescriptionAddition__add__+追加を実装します。 Subtraction__sub__–減算を実装します。Multiplication__mul__*乗算除算を実装します__div__/除算を実装します。床除算__floordiv__//床除算を実装します。
#2。 比較操作
算術マジック メソッドと同様に、これらのメソッドは、それらが定義されているクラスのインスタンスが比較演算子の左側に配置されたときに呼び出されます。 また、算術マジック メソッドと同様に、これらは 2 つのパラメーターで呼び出されます。 1 つ目は、オブジェクトのインスタンスへの参照です。 2 番目は、記号の右側の値への参照です。
NameMethodSignDescriptionLess than__lt__<より小さい比較を実装しますGreater than__gt__>より大きい比較を実装しますEqual to__eq__==等しい比較を実装しますLess than or equal to__le__>=より小さいか等しい比較を実装しますGreater than or equal to__ge__<=より大きいか等しいを実装します比較
#3。 ライフサイクル オペレーション
これらのメソッドは、インスタンス化や削除など、オブジェクトのさまざまなライフサイクル メソッドに応答して呼び出されます。 コンストラクタ __init__ は、このカテゴリに分類されます。 このカテゴリの一般的な方法を次の表に示します。
NameMethodDescriptionConstructor__init__このメソッドは、定義されているクラスのオブジェクトが削除されるたびに呼び出されます。 開いたファイルを閉じるなどのクリーンアップ アクションを実行するために使用できます。Deletion__del__このメソッドは、定義されているクラスのオブジェクトが削除されるたびに呼び出されます。 開いたファイルを閉じるなどのクリーンアップ アクションを実行するために使用できます。New__new____new__ メソッドは、指定されたクラスのオブジェクトがインスタンス化されるときに最初に呼び出されます。 このメソッドは、コンストラクターの前に呼び出され、クラスと追加の引数を受け取ります。 クラスのインスタンスを返します。 ほとんどの場合、あまり役に立ちませんが、ここで詳しく説明します。
#4。 表現操作
NameMethodDescriptionStr__str__ 人間が判読できるオブジェクトの文字列表現を返します。 このメソッドは、str() 関数を呼び出すときに呼び出され、クラスのインスタンスを引数として渡します。 インスタンスを print() および format() 関数に渡すときにも呼び出されます。 アプリケーションのエンドユーザーが理解できる文字列を提供することを目的としています。Repr__repr__開発者が使用するオブジェクトの文字列表現を返します。 理想的には、返される文字列は、文字列だけからオブジェクトの同一のインスタンスを構築できるように、情報が豊富である必要があります。
マジック メソッドを作成するためのベスト プラクティス
マジック メソッドは驚くべきものであり、コードを簡素化します。 ただし、以下の点に注意してご利用ください。
- 控えめに使用する – クラスにあまりにも多くのマジック メソッドを実装すると、コードが理解しにくくなります。 本質的なものだけを実装するように制限してください。
- __setatrr__ や __getattr__ などのメソッドを使用する前に、そのパフォーマンスへの影響を理解しておいてください。
- マジック メソッドの動作を文書化して、他の開発者がその動作を正確に把握できるようにします。 これにより、必要に応じてそれらを使用してデバッグすることが容易になります。
最後の言葉
この記事では、組み込み操作で使用できるクラスを作成する方法として、マジック メソッドを紹介しました。 また、それらがどのように定義されるかについても説明し、魔法のメソッドが実装されたクラスの例を調べました。 次に、心に留めておくべきいくつかのベスト プラクティスを共有する前に、使用する可能性が高く、必要なさまざまな方法について説明しました。
次に、Python で Counter クラスを実装する方法を学びたいと思うかもしれません。