PYTHON MEBY

Pythonで特殊メソッドを使う(__str__, __repr__, __add__ など)

この記事では、Pythonの特殊メソッド(__str__, __repr__, __add__など)の使い方を説明します。これらのメソッドをオーバーライドすることで、クラスの動作をカスタマイズし、よりPythonicなコードを作成できます。

目次

特殊メソッドとは?

Pythonでは、`__methodname__` のようなダブルアンダースコアで囲まれたメソッドを特殊メソッドと呼びます。これらは、特定の状況(オブジェクトの文字列表現、加算演算など)で自動的に呼び出されるメソッドで、クラスの振る舞いをカスタマイズするために使用します。

特殊メソッドをオーバーライドすることで、標準的なPythonの動作を変更し、独自のクラスをより直感的に、そしてPythonらしく扱うことができます。

__str__メソッド:オブジェクトの文字列表現

`__str__`メソッドは、`str()`関数や`print()`関数でオブジェクトが文字列に変換される際に呼び出されます。このメソッドは、ユーザーフレンドリーなオブジェクトの表現を返すように実装します。

class MyClass:
    def __init__(self, value):
        self.value = value
    def __str__(self):
        return f"MyClass object with value: {self.value}"

my_object = MyClass(10)
print(my_object)  # 出力: MyClass object with value: 10
print(str(my_object)) # 出力: MyClass object with value: 10

上記の例では、`__str__`メソッドは、オブジェクトの値を含む分かりやすい文字列を返します。

__repr__メソッド:オブジェクトの開発者向け表現

`__repr__`メソッドは、`repr()`関数でオブジェクトが文字列に変換される際に呼び出されます。このメソッドは、オブジェクトを再構築するために使用できる、より詳細で技術的な表現を返すように実装します。

class MyClass:
    def __init__(self, value):
        self.value = value
    def __repr__(self):
        return f"MyClass({self.value})"

my_object = MyClass(10)
print(repr(my_object))  # 出力: MyClass(10)

上記の例では、`__repr__`メソッドは、`MyClass`オブジェクトを再構築するために使用できる文字列を返します。

__add__メソッド:オブジェクトの加算

`__add__`メソッドは、`+`演算子がオブジェクトに使用された際に呼び出されます。このメソッドは、2つのオブジェクトの加算結果を返すように実装します。

class MyNumber:
    def __init__(self, value):
        self.value = value
    def __add__(self, other):
        return MyNumber(self.value + other.value)

num1 = MyNumber(5)
num2 = MyNumber(10)
num3 = num1 + num2
print(num3.value)  # 出力: 15

この例では、`MyNumber`オブジェクトの加算を定義しています。`+`演算子を使うと、2つの`MyNumber`オブジェクトの`value`属性が加算され、新しい`MyNumber`オブジェクトが返されます。

その他の便利な特殊メソッド

他にも多くの特殊メソッドがあり、それぞれが特定の状況で呼び出されます。例として、`__len__` (長さ取得), `__getitem__` (添え字アクセス), `__iter__` (反復処理)などがあります。Pythonのドキュメントを参照して、必要な特殊メソッドを探してみてください。

実践例:簡単なクラスの作成

以下は、`__str__` と `__repr__` メソッドを実装した簡単な`Point`クラスの例です。

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __str__(self):
        return f"Point({self.x}, {self.y})"
    def __repr__(self):
        return f"Point(x={self.x}, y={self.y})"

p = Point(3, 4)
print(p) # Point(3, 4)
print(repr(p)) # Point(x=3, y=4)

この例では、`__str__`メソッドは簡潔な文字列表現を、`__repr__`メソッドはより詳細な表現を提供します。

関連記事