Python のオーバーロード演算子

Fariba Laiq 2023年6月21日
  1. Python でのオーバーロード演算子
  2. Python で + 演算子をオーバーロードする
  3. Python で > 演算子をオーバーロードする
  4. Python で == 演算子をオーバーロードする
Python のオーバーロード演算子

演算子のオーバーロードとは、さまざまな状況での演算子の動作方法を変更することを意味します。 ポリモーフィズムの一種です。

演算子のオーバーロードを使用すると、演算子に特別な意味や機能を追加して、複数の操作を実行できます。

たとえば、+ 演算子は整数オペランドで加算を実行します。 ただし、文字列オペランドで使用すると、+ 演算子がオーバーロードされるため、連結が実行されます。

Python でのオーバーロード演算子

Python は、Magic メソッドを介してユーザー定義のデータ型で演算子をオーバーロードする方法を提供します。 これらは、関連付けられた演算子を使用するときに自動的に呼び出される特別なメソッドです。

アンダースコアが 2つあるため、Dunder メソッドとも呼ばれます。

たとえば、演算子 + を書くと、魔法のメソッド __add__() がバックエンドで自動的に呼び出されます。 したがって、特定の演算子で演算子のオーバーロードを実行したい場合は、その魔法のメソッドのコードを変更するだけで済みます。

Python で + 演算子をオーバーロードする

次のコードでは、+ 演算子をオーバーロードする魔法のメソッド __add__() を実装したユーザー定義クラスがあります。

int1 + int2 と書くと、実際にはバックエンドで魔法のメソッド __add()__int1.__add__(int2) として呼び出されます。 同じ作業がストリングにも当てはまります。

str1 + str2 と書くと、内部的にマジックメソッドは str1.__add__(str2) として呼び出されます。

コード例:

# Python 3.x
class MyAddion:
    def __init__(self, a):
        self.a = a

    def __add__(self, b):
        return self.a + b.a


int1 = MyAddion(2)
int2 = MyAddion(2)
str1 = MyAddion("Delft")
str2 = MyAddion("Stack")
print(int1 + int2)
print(str1 + str2)

出力:

#Python 3.x
4
DelftStack

Python で > 演算子をオーバーロードする

ここでは、MyComp クラスで > 演算子をオーバーロードしています。 演算子 > を書くと、魔法のメソッド __gt__() が内部的に呼び出されます。

したがって、int1 > int2 と書くと、魔法のメソッド __gt__()int1.__gt__(int2) として呼び出されます。 条件が true の場合、このメソッドは true を返します。 それ以外の場合、false を返します。

コード例:

# Python 3.x
class MyComp:
    def __init__(self, a):
        self.a = a

    def __gt__(self, b):
        if self.a > b.a:
            return True
        else:
            return False


int1 = MyComp(5)
int2 = MyComp(3)
if int1 > int2:
    print(int1.a, "is greater than", int2.a)
else:
    print(int2.a, "is greater than", int1.a)

出力:

#Python 3.x
5 is greater than 3

Python で == 演算子をオーバーロードする

ここで、クラス MyEquality で等値演算子 == をオーバーロードしました。 int1 == int2 と書くと、内部的に魔法のメソッド __eq__()int1.__eq__(int2) として呼び出されます。

両方のオペランドが等しい場合、Equal を返します。 それ以外の場合は、Not Equal を返します。

コード例:

# Python 3.x
class MyEquality:
    def __init__(self, a):
        self.a = a

    def __eq__(self, b):
        if self.a == b.a:
            return "Equal"
        else:
            return "Not equal"


int1 = MyEquality(3)
int2 = MyEquality(3)
print(int1 == int2)

出力:

#Python 3.x
Equal

演算子のオーバーロードの場合、演算子のオペランドの数を変更できないことに注意してください。 単項演算子を二項演算子としてオーバーロードすることはできません。

たとえば、~ 反転演算子 (単項演算子) を二項演算子としてオーバーロードすることはできません。

著者: Fariba Laiq
Fariba Laiq avatar Fariba Laiq avatar

I am Fariba Laiq from Pakistan. An android app developer, technical content writer, and coding instructor. Writing has always been one of my passions. I love to learn, implement and convey my knowledge to others.

LinkedIn

関連記事 - Python Operator