<一覧に戻る

__str__ メソッドのオーバーライド

オブジェクト指向プログラミング(OOP)において、__str__ メソッドはオブジェクトの文字列表現を定義する特別なメソッドです。Pythonでは、print 関数や str() 関数を使ってオブジェクトを表示する際に、このメソッドが呼び出されます。__str__ メソッドをオーバーライドすることで、オブジェクトの出力形式をカスタマイズし、よりわかりやすい情報を提供することができます。このセクションでは、__str__ メソッドの基本的な使い方とオーバーライドの方法について、Pythonのサンプルコードを用いて初心者にもわかりやすく解説します。

__str__ メソッドとは?

__str__ メソッドは、オブジェクトの「非公式」な文字列表現を返すために使用されます。主にユーザー向けの出力に適しており、オブジェクトの内容を読みやすく表示するために用いられます。デフォルトでは、オブジェクトのメモリアドレスが返されますが、これをオーバーライドすることで、意味のある情報を表示できます。

__str__ メソッドの基本構文

以下に、__str__ メソッドを含むクラスの基本的な定義方法を示します。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

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

説明

  • __str__ メソッド:
  • self: 現在のインスタンスを指します。
  • このメソッドは、オブジェクトを文字列として表現するためのものです。
  • メソッド内で return 文を使用して、返したい文字列を指定します。

__str__ メソッドの使用例

__str__ メソッドをオーバーライドしたクラスのインスタンスを print 関数や str() 関数で表示すると、カスタマイズした文字列が出力されます。

サンプルコード

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

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

# Personクラスのインスタンスを生成
person1 = Person("太郎", 25)
person2 = Person("花子", 30)

# __str__ メソッドの呼び出し
print(person1)  # 出力: Person(name=太郎, age=25)
print(person2)  # 出力: Person(name=花子, age=30)

# str() 関数を使用
print(str(person1))  # 出力: Person(name=太郎, age=25)

説明

  • インスタンスの生成:
  • person1person2 は、Person クラスから生成されたオブジェクトです。

  • print 関数の使用:

  • print(person1) とすると、__str__ メソッドが呼び出され、カスタマイズされた文字列が出力されます。

  • str() 関数の使用:

  • str(person1) も同様に __str__ メソッドを呼び出し、文字列を返します。

__repr__ メソッドとの違い

__str__ メソッドと似た役割を持つ __repr__ メソッドがありますが、目的が異なります。

  • __str__ メソッド:
  • ユーザー向けの「非公式」な文字列表現を提供します。
  • print 関数や str() 関数で呼び出されます。

  • __repr__ メソッド:

  • 開発者向けの「公式」な文字列表現を提供します。
  • repr() 関数や対話型シェルでオブジェクトを表示する際に呼び出されます。

通常、__repr__ メソッドは、__str__ メソッドと同様にオーバーライドされることが多いですが、両者を明確に区別することで、デバッグやログ出力の際に役立ちます。

サンプルコード

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

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

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

# Personクラスのインスタンスを生成
person = Person("太郎", 25)

# __str__ メソッドの呼び出し
print(person)      # 出力: Person(name=太郎, age=25)

# __repr__ メソッドの呼び出し
print(repr(person))  # 出力: Person('太郎', 25)

説明

  • __repr__ メソッド:
  • 開発者向けの文字列表現として、オブジェクトの再生成可能な形式を提供します。
  • デバッグやログ出力での利用に適しています。

__str__ メソッドの実践例

ここでは、Book クラスを作成し、__str__ メソッドをオーバーライドして、書籍の情報をわかりやすく表示する例を示します。

サンプルコード

class Book:
    def __init__(self, title, author, year_published):
        self.title = title
        self.author = author
        self.year_published = year_published

    def __str__(self):
        return f"『{self.title}』 by {self.author} ({self.year_published})"

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

# Bookクラスのインスタンスを生成
book1 = Book("1984", "ジョージ・オーウェル", 1949)
book2 = Book("Pythonプログラミング入門", "山田太郎", 2021)

# __str__ メソッドの呼び出し
print(book1)  # 出力: 『1984』 by ジョージ・オーウェル (1949)
print(book2)  # 出力: 『Pythonプログラミング入門』 by 山田太郎 (2021)

# __repr__ メソッドの呼び出し
print(repr(book1))  # 出力: Book('1984', 'ジョージ・オーウェル', 1949)
print(repr(book2))  # 出力: Book('Pythonプログラミング入門', '山田太郎', 2021)

説明

  • __str__ メソッドのオーバーライド:
  • 書籍のタイトル、著者、出版年をわかりやすい形式で返します。

  • __repr__ メソッドのオーバーライド:

  • オブジェクトの再生成可能な形式を返します。

  • 出力結果:

  • print(book1) は、ユーザー向けの読みやすい形式で書籍情報を表示します。
  • repr(book1) は、開発者向けの詳細なオブジェクト情報を表示します。

まとめ

  • __str__ メソッドは、オブジェクトのユーザー向けの文字列表現を定義するためのものです。
  • デフォルトでは、オブジェクトのメモリアドレスが表示されますが、__str__ メソッドをオーバーライドすることで、意味のある情報を表示できます。
  • __repr__ メソッドと併用することで、開発者向けとユーザー向けの両方の文字列表現を提供できます。
  • 実際に __str__ メソッドをオーバーライドして、オブジェクトの出力形式をカスタマイズすることで、コードの可読性とデバッグ効率を向上させることができます。

__str__ メソッドを理解し効果的に活用することで、Pythonでのオブジェクト指向プログラミングの利便性をさらに高めることができます。実際にコードを書いて試すことで、__str__ メソッドの役割とその使い方をより深く理解しましょう。

参考資料

出力結果: