Pythonの特殊メソッド(__str__ / __repr__ / __eq__)の活用方法を完全解説!初心者でもわかるオブジェクト指向入門
生徒
「Pythonでクラスを作ったら、printするとよくわからない表示になるんですが、これは普通なんですか?」
先生
「その表示は、Pythonの__str__や__repr__という特殊メソッドが関係しています。設定していないと、機械向けの表示になるんです。」
生徒
「特殊メソッドって何ですか?自分で呼び出すものなんですか?」
先生
「いいところに気づきましたね。特殊メソッドは、Pythonが自動で呼び出してくれる便利な仕組みです。順番に見ていきましょう。」
1. Pythonの特殊メソッドとは?
Pythonの特殊メソッドとは、メソッド名の前後にアンダースコアが二つずつ付いた特別なメソッドのことです。代表例として__str__、__repr__、__eq__があります。
これらは自分で直接呼び出すよりも、printしたときや==で比較したときなど、特定の場面でPythonが自動的に使います。人が意識しなくても動くため、クラスの振る舞いを自然に定義できるのが特徴です。
2. __str__メソッドとは?人にやさしい表示を作る
__str__メソッドは、print関数でオブジェクトを表示するときに使われます。初心者の方は「画面にどう表示されるかを決めるもの」と覚えると理解しやすいです。
たとえば、名札のように「人が読んでわかりやすい説明」を返す役割を持っています。
class User:
def __init__(self, name):
self.name = name
def __str__(self):
return f"ユーザー名は {self.name} です"
user = User("太郎")
print(user)
ユーザー名は 太郎 です
3. __repr__メソッドとは?プログラム向けの正確な表現
__repr__メソッドは、主に開発者やプログラム向けの表示を担当します。デバッグやログ出力などで使われることが多く、「正確さ」を重視します。
何も設定しない場合、Pythonはクラス名とメモリ位置のような情報を表示しますが、初心者には意味がわかりにくいです。そのため、自分で定義することで理解しやすくなります。
class Book:
def __init__(self, title, price):
self.title = title
self.price = price
def __repr__(self):
return f"Book(title='{self.title}', price={self.price})"
book = Book("Python入門", 2500)
print(book)
Book(title='Python入門', price=2500)
4. __str__と__repr__の違いを整理しよう
__str__と__repr__は似ていますが、目的が異なります。__str__は人間向け、__repr__はプログラム向けです。
たとえば、商品の値札が__str__、商品管理用の型番や内部情報が__repr__だと考えるとイメージしやすいでしょう。両方を定義しておくと、場面に応じた表示が可能になります。
5. __eq__メソッドとは?オブジェクト同士を比べる
__eq__メソッドは、==演算子でオブジェクト同士を比較するときに使われます。何も設定しない場合、Pythonは「同じ場所にあるかどうか」だけを見ます。
しかし、実務では「中身が同じかどうか」で判断したいことが多いため、__eq__を定義します。
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __eq__(self, other):
return self.x == other.x and self.y == other.y
p1 = Point(1, 2)
p2 = Point(1, 2)
print(p1 == p2)
True
6. 初心者がつまずきやすい注意点
特殊メソッドは便利ですが、いくつか注意点があります。まず、メソッド名は必ず正確に書く必要があります。アンダースコアの数を間違えると動きません。
また、__eq__では比較対象が同じクラスかどうかを確認しないと、思わぬエラーにつながることがあります。最初はシンプルな条件で書くのがおすすめです。
7. 特殊メソッドを使うメリット
特殊メソッドを使うことで、コードが読みやすくなり、意図が伝わりやすくなります。特にPythonのオブジェクト指向では、クラスの振る舞いを自然な形で定義できる点が大きな利点です。
初心者の方でも、表示や比較を自分でコントロールできるようになると、クラス設計の理解が一段深まります。