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
演算子のオーバーロードの場合、演算子のオペランドの数を変更できないことに注意してください。 単項演算子を二項演算子としてオーバーロードすることはできません。
たとえば、~
反転演算子 (単項演算子) を二項演算子としてオーバーロードすることはできません。
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