Pythonの特殊メソッド(__str__ / __repr__ / __eq__)を便利に使う方法をやさしく解説
生徒
「Pythonで作ったクラスをprintすると、よくわからない文字が出るんですが、これは普通なんですか?」
先生
「それはPythonの仕組みがそのまま表示されている状態ですね。実は、表示のしかたは自分で決められます。」
生徒
「えっ、自分で? 比較するときも同じですか?」
先生
「はい。__str__や__repr__、__eq__という特殊なメソッドを使うと、とても分かりやすくなります。」
1. Pythonの特殊メソッドとは?
Pythonには「特殊メソッド」と呼ばれる、少し変わった名前のメソッドがあります。名前の前後にアンダースコアが二つずつ付いているのが特徴です。これらは、Pythonが内部で自動的に呼び出す決まりになっています。
例えば、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)
ユーザー名:たろう
もし__str__を書かなければ、意味の分かりにくい情報が表示されてしまいます。そのため、画面に表示するクラスではほぼ必須と言えます。
3. __repr__メソッドとは?
__repr__は、「開発者が中身を確認するための文字の形」を決めるメソッドです。少し難しく感じるかもしれませんが、「プログラムを作る人向けの表示」と覚えると理解しやすくなります。
荷物の中身を確認するためのラベルのような役割で、正確さが重視されます。
class User:
def __init__(self, name):
self.name = name
def __repr__(self):
return f"User(name='{self.name}')"
user = User("はなこ")
user
User(name='はなこ')
__str__と__repr__の両方がある場合、通常の表示では__str__が優先されます。どちらも書いておくと、表示と確認の両方で便利です。
4. __eq__メソッドとは?
__eq__は、「同じかどうか」を判断するためのメソッドです。==を使ったときに、自動的に呼び出されます。
何も設定しない場合、Pythonは「同じ場所にあるかどうか」で比べます。しかし、多くの場合は「中身が同じか」を比べたいですよね。
class User:
def __init__(self, name):
self.name = name
def __eq__(self, other):
return self.name == other.name
user1 = User("たろう")
user2 = User("たろう")
print(user1 == user2)
True
このようにすると、名前が同じユーザーは「同じもの」として扱われます。これは会員情報やデータ管理でとても役立ちます。
5. 3つの特殊メソッドを使うと何が良いのか
__str__で表示が分かりやすくなり、__repr__で中身を確認しやすくなり、__eq__で比較が直感的になります。これらを設定するだけで、クラスは一気に使いやすくなります。
特にPythonのオブジェクト指向プログラミングでは、「人に優しい表示」と「正しい比較」がとても重要です。難しい知識がなくても、基本を押さえるだけでコードの品質が大きく変わります。