Pythonの演算子オーバーロードとは?仕組みと実装方法をわかりやすく解説
+演算子は、数値の加算にも文字列の連結にも使用できることをご存じでしょう。これが可能なのは、+演算子が int クラスと str クラスの両方でオーバーロードされているためです。
実は、Pythonの演算子はそれぞれのクラス内で定義されたメソッドにすぎません。このように、演算子に対応するメソッドを自分で定義することを「演算子オーバーロード(operator overloading)」と呼びます。
たとえば、独自に定義したクラス(ユーザー定義型)のオブジェクト同士で + 演算子を使えるようにしたい場合は、__add__ という特殊メソッドを定義する必要があります。
サンプルコード:Circleクラスで+演算子を実装する
以下のコードを見ると、演算子オーバーロードの仕組みがひと目で理解できるでしょう。ここでは、円を表す Circle クラスに __add__ メソッドを定義し、2つの円の半径を足し合わせた新しい円を作成できるようにしています。
import math
class Circle:
def __init__(self, radius):
self.__radius = radius
def setRadius(self, radius):
self.__radius = radius
def getRadius(self):
return self.__radius
def area(self):
return math.pi * self.__radius ** 2
def __add__(self, another_circle):
return Circle(self.__radius + another_circle.__radius)
c1 = Circle(3)
print(c1.getRadius())
c2 = Circle(6)
print(c2.getRadius())
c3 = c1 + c2 # __add__メソッドを定義したことで、+演算子がオーバーロードされている
print(c3.getRadius())
実行結果
このコードを実行すると、次の出力が得られます。
3 6 9
c1 + c2 の部分で、半径3の円と半径6の円が加算され、半径9の新しい Circle オブジェクトが生成されていることがわかります。これは __add__ メソッドを追加して + 演算子をオーバーロードしたためです。
まとめ
演算子の動作を変更し、ユーザー定義型に対しても機能するようにすることを演算子オーバーロードと呼びます。Pythonでは、すべての演算子に対応する特殊メソッド(スペシャルメソッド)が用意されており、+ なら __add__、- なら __sub__、* なら __mul__ のように対応関係が決まっています。
さらに詳しい情報については、Python公式ドキュメントの special method names を参照してください。
-
Pythonの正規表現における\B(非単語境界)の動作を解説
Pythonの正規表現における \B の意味とは?正規表現の \b は「単語境界」を表すメタ文字で、片側が単語構成文字(通常は英字・数字・アンダースコア)であるような位置にマッチします。一方、今回解説する \B はその逆で、「\b がマッチしないすべての位置」、つまり単語境界ではない位置にマッチします。\B の動作を確認するサンプルコード以下のコードは、re.findall() を使って正規表現 \Bcat がどのように動作するかを示したものです。import re result = re.findall(r\Bcat, certificate) result2 = re.findall(r
-
Pythonにおけるアンダースコア(_)の意味と使い方をわかりやすく解説
Pythonでは、アンダースコア(_)は特別な役割を持つ記号です。一見ただの文字に見えますが、実際にはインタープリタの動作や命名規則、数値リテラルの表記など、さまざまな場面で重要な働きをします。この記事では、Pythonでアンダースコアが使われる主な5つのケースを、コード例とともにわかりやすく解説します。1. インタープリタで直前の式の値を保持するPythonの対話モード(インタープリタ)では、直前に評価した式の結果が、特別な変数「_」に自動的に格納されます。計算結果をすぐに再利用したいときに非常に便利です。使用例>>> 12 + 10 22 >>> _ 2