{category}

Python - 特殊メソッド

__repr__

リッパー(関数とクラス

意味 開発者向け表現


__repr__とは?

オブジェクトの開発者向け表現を返す特殊なメソッド。`__str__`メソッドと似ていますが、`__repr__`はオブジェクトの内部構造をより詳細に表現することを目的としています。主にデバッグなどで役立ちます。

__repr__の具体的な使い方

eval()での再現性を考慮した実装

import datetime

class Meeting:
    def __init__(self, title, date):
        self.title = title
        self.date = date

    def __repr__(self):
        return f'Meeting(title={self.title!r}, date=datetime.date({self.date.year}, {self.date.month}, {self.date.day}))'

meeting = Meeting('プロジェクト会議', datetime.date(2023, 5, 15))
print(repr(meeting))

# eval()で再現
reproduced = eval(repr(meeting))
print(f'元のオブジェクト: {meeting}')
print(f'再現したオブジェクト: {reproduced}')
print(f'同一オブジェクト?: {meeting == reproduced}')

👇出力結果

Meeting(title='プロジェクト会議', date=datetime.date(2023, 5, 15))
元のオブジェクト: Meeting(title='プロジェクト会議', date=datetime.date(2023, 5, 15))
再現したオブジェクト: Meeting(title='プロジェクト会議', date=datetime.date(2023, 5, 15))
同一オブジェクト?: False

Meetingクラスを定義し、__repr__メソッドでeval()関数で評価した際に元のオブジェクトと同等のオブジェクトを生成できる文字列を返すように実装しています。repr()関数を使用して__repr__の出力を確認し、さらにeval()関数を使って再現性をテストしています。

デバッグ情報の提供

class ComplexNumber:
    def __init__(self, real, imag):
        self.real = real
        self.imag = imag

    def __repr__(self):
        return f'ComplexNumber(real={self.real}, imag={self.imag})'

    def __str__(self):
        return f'{self.real} + {self.imag}i'

numbers = [ComplexNumber(1, 2), ComplexNumber(3, -4)]
print('デバッグ情報:')
print(repr(numbers))
print('\n通常の表示:')
for num in numbers:
    print(num)

👇出力結果

デバッグ情報:
[ComplexNumber(real=1, imag=2), ComplexNumber(real=3, imag=-4)]

通常の表示:
1 + 2i
3 + -4i

ComplexNumberクラスを定義し、__repr__メソッドでデバッグ用の詳細な情報を、__str__メソッドで通常表示用の簡潔な情報を返すように実装しています。repr()関数を使用してデバッグ情報を表示し、通常のprint文で__str__の出力を確認しています。

__repr__に関するよくある質問

Q. __repr__の戻り値の形式は?
A. __repr__メソッドの戻り値は、理想的にはeval()関数で評価した際に元のオブジェクトと同等のオブジェクトを生成できる文字列であるべきです。つまり、eval(repr(obj)) == objとなることが望ましいです。ただし、これが常に可能とは限らないため、できるだけオブジェクトの状態を正確に表現する文字列を返すようにしましょう。
Q. __repr__がないとどうなる?
A. __repr__メソッドが定義されていない場合、Pythonはデフォルトの実装を使用します。これは通常、クラス名とオブジェクトのメモリアドレスを含む文字列(例:<__main__.Person object at 0x...>)です。カスタムの__repr__を定義することで、より有用な情報を提供できます。
Q. __repr__と__str__両方必要?
A. 両方を定義することが推奨されますが、必須ではありません。__str__が定義されていない場合、Pythonは__repr__を使用します。逆は成り立ちません。一般的に、__repr__はより詳細で明確な表現を提供し、__str__はより簡潔で読みやすい表現を提供します。両方を定義することで、異なる状況に適した出力を得られます。

__repr__が学べる書籍の紹介

「プログラミング単語帳」を使って、プログラミングの単語を英単語のように学習してみませんか?
プログラミング単語帳には、Pythonの__repr__や__iter__、__len__、__enter__、などのような実務でよく使われる単語が数百以上収録されています。
この書籍には、プログラミングの単語の意味や読み方、単語の使い方がわかる例文などが掲載されており、いつでもどこでもプログラミングの学習ができます。

よく使われる単語にだけ絞って学習することができるので、効率的にプログラミングが学習できます。

1日5分の暗記でプログラミンが身に付く!プログラミング単語帳 公式ストアで発売中!

HTML編、CSS編、JavaScript編、PHP編、Ruby編、その他単語編の6シリーズ分が公式ストアにて販売中です。気になった方はぜひ購入してみてください。


Pythonを学べる「プログラミング単語帳」アプリ

プログラミング単語帳がアプリになりました!Pythonはもちろん、10種類のプログラミング言語の中から、よく使われる単語をスマホで学習できます。

収録単語は2,000単語以上!
現在は、HTML、CSS、JavaScirpt、PHP、Laravel、Ruby、Python、MySQL、Linux、など10カテゴリーの単語帳が1つのアプリに収録されています。

いつでも、どこでも、隙間時間を有効活用して、プログラミングを効率的に学べるので、ぜひダウンロードしてみてください。

2024年7月アップデート情報:「Laravel」カテゴリーが追加されましました!

2024年8月アップデート情報:「MySQL」「Linux」カテゴリーが追加されましました!


関連するそのほかの単語

__iter__

反復処理の準備

種類: 特殊メソッド

__len__

長さや要素数を取得

種類: 特殊メソッド

__enter__

開始処理

種類: 特殊メソッド

pybullet

ロボットを仮想空間で動かす

種類: ロボット工学

elif

さらに条件を追加

種類: 条件分岐