Python

【Python】第5章第10回:特殊メソッド(__str__, __repr__ など)の使い方

本記事では、Pythonにおける「特殊メソッド(ダンダーメソッド)」の中でも特に重要な__str____repr__について解説します。これらを適切に活用することで、クラスの可読性とデバッグ効率を向上させることができます。

0. 記事の概要

この記事を読むメリット

  • 特殊メソッドの基本を理解:クラス設計における柔軟性を向上させます。
  • デバッグ効率の向上:__repr__を活用して、オブジェクトの状態を簡単に把握できます。
  • 出力のカスタマイズ:__str__を使って、ユーザー向けの情報をわかりやすく表示します。

この記事で学べること

  • 特殊メソッドの役割と仕組み
  • __str____repr__の具体的な実装例
  • 特殊メソッドを使った応用例

1. 特殊メソッドとは?

1.1 定義

特殊メソッド(ダンダーメソッド)は、Pythonのクラスにおいて特別な動作を定義するためのメソッドです。__str____repr__など、名前がダブルアンダースコア(__)で囲まれています。

1.2 主な特殊メソッド

  • __str__: ユーザー向けの文字列表現を定義
  • __repr__: デバッグや開発者向けの文字列表現を定義
  • __eq__: オブジェクト同士の等価性を定義
  • __lt__: 小なり演算子(<)の動作を定義
  • __add__: 加算演算子(+)の動作を定義

2. __str__ と __repr__ の使い方

2.1 基本的な使い方

# __str__と__repr__の例
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return f"名前: {self.name}, 年齢: {self.age}"

    def __repr__(self):
        return f"Person(name='{self.name}', age={self.age})"

# インスタンス生成
p = Person("太郎", 25)

# 出力例
print(str(p))  # 名前: 太郎, 年齢: 25
print(repr(p)) # Person(name='太郎', age=25)
動作解説
  1. __str__は、print関数でオブジェクトを表示する際に呼び出され、ユーザー向けの情報を提供します。
  2. __repr__は、デバッグ時にオブジェクトの詳細情報を確認するために使用されます。

3. __str__ と __repr__ を使った応用

3.1 クラスをより直感的にデバッグ可能に

# 応用例: デバッグ用情報をカスタマイズ
class Product:
    def __init__(self, name, price):
        self.name = name
        self.price = price

    def __repr__(self):
        return f"Product(name='{self.name}', price={self.price})"

# リスト内のオブジェクトを表示
products = [Product("ペン", 100), Product("ノート", 200)]
print(products)
# 出力: [Product(name='ペン', price=100), Product(name='ノート', price=200)]
動作解説
  1. クラス内の__repr__メソッドを定義することで、リスト内のオブジェクトも見やすい形で表示されます。

4. 練習問題

以下の課題に挑戦してみましょう。

  1. 「Book」というクラスを作成し、titleauthorを属性として保持してください。
  2. __str__を使って、titleauthorを見やすく出力できるようにしてください。
  3. __repr__を使って、デバッグ用の詳細情報を出力してください。

5. 練習問題の解答と解説

問1〜3の解答例

# Bookクラスの例
class Book:
    def __init__(self, title, author):
        self.title = title
        self.author = author

    def __str__(self):
        return f"書籍名: {self.title}, 著者: {self.author}"

    def __repr__(self):
        return f"Book(title='{self.title}', author='{self.author}')"

# インスタンス生成
book = Book("Python入門", "山田太郎")
print(str(book))   # 書籍名: Python入門, 著者: 山田太郎
print(repr(book))  # Book(title='Python入門', author='山田太郎')

6. まとめ

特殊メソッドを適切に活用することで、クラスの可読性やデバッグ効率が大幅に向上します。特に__str____repr__は、日常的に利用される重要なメソッドです。練習問題を通じて、これらの活用方法を身につけましょう。