Pythonで特殊メソッドを使う(__str__, __repr__, __add__ など)
この記事では、Pythonの特殊メソッド(__str__, __repr__, __add__など)の使い方を説明します。これらのメソッドをオーバーライドすることで、クラスの動作をカスタマイズし、よりPythonicなコードを作成できます。
目次
- 特殊メソッドとは?
- __str__メソッド:オブジェクトの文字列表現
- __repr__メソッド:オブジェクトの開発者向け表現
- __add__メソッド:オブジェクトの加算
- その他の便利な特殊メソッド
- 実践例:簡単なクラスの作成
特殊メソッドとは?
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__`メソッドはより詳細な表現を提供します。