0Pricing
Python Academy · レッスン

特殊メソッド: __str__ と __repr__

読みやすいオブジェクト表現を返す特殊メソッドを実装します。

「特殊メソッド: __str__ と __repr__」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。

マジックメソッドとは

マジックメソッド(ダンダーメソッド)とは、ダブルアンダースコアを持つ特殊メソッドで、出力や比較など特定の状況でPythonが呼び出します。

class Foo:
    def __str__(self):
        return "I am Foo"

f = Foo()
print(f)        # I am Foo
print(str(f))   # I am Foo

__repr__:開発者向けの表現

__repr__ は曖昧さのない文字列を返す必要があり、理想的にはその文字列からオブジェクトを再作成できるようにします。REPLに表示され、repr() によって使われます。

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __repr__(self):
        return f"Point({self.x}, {self.y})"

p = Point(3, 4)
print(repr(p))  # Point(3, 4)

__str__:ユーザー向けの表現

__str__ は人間が読みやすい文字列を提供します。print() と str() が呼び出します。定義されていない場合、Pythonは __repr__ にフォールバックします。

class Temperature:
    def __init__(self, celsius):
        self.celsius = celsius

    def __str__(self):
        return f"{self.celsius}°C"

    def __repr__(self):
        return f"Temperature({self.celsius})"

t = Temperature(100)
print(t)        # 100°C
print(repr(t))  # Temperature(100)

それぞれが呼び出される場面

__str__: print()、str()、f文字列。__repr__: REPL、repr()、要素を表示するコンテナ。

class Item:
    def __str__(self): return "str"
    def __repr__(self): return "repr"

x = Item()
print(x)         # str
print([x])       # [repr]  ← list uses repr for elements

カスタム書式設定のための__format__

__format__ を定義すると、書式指定を含むf文字列でオブジェクトをどのように表示するかを制御できます。

class Money:
    def __init__(self, amount):
        self.amount = amount

    def __format__(self, spec):
        if spec == "usd":
            return f"${self.amount:.2f}"
        return str(self.amount)

m = Money(9.5)
print(f"{m:usd}")  # $9.50

真偽値判定のための__bool__

__bool__ を使うと、オブジェクトを真偽値コンテキストで評価できるようになります。True または False を返します。

class Bag:
    def __init__(self, items):
        self.items = items

    def __bool__(self):
        return len(self.items) > 0

b = Bag([])
if not b:
    print("Bag is empty")  # Bag is empty

len()のための__len__

__len__ によって len(obj) が使えるようになります。また、__bool__ が定義されていない場合は、__bool__ の判定にも使われます。

class Stack:
    def __init__(self):
        self.data = []

    def push(self, v): self.data.append(v)

    def __len__(self):
        return len(self.data)

s = Stack()
s.push(1)
print(len(s))  # 1

等価性のための__eq__

__eq__ を定義すると、== で2つのインスタンスを等しいとみなす条件を指定できます。

class Vector:
    def __init__(self, x, y):
        self.x, self.y = x, y

    def __eq__(self, other):
        return self.x == other.x and self.y == other.y

print(Vector(1,2) == Vector(1,2))  # True

__eq__と組み合わせる__hash__

__eq__ を定義すると、Pythonは __hash__ を None に設定し、オブジェクトをハッシュ化できない状態にします。オブジェクトを集合や辞書で使う必要がある場合は、__hash__ も定義します。

class Point:
    def __init__(self, x, y): self.x, self.y = x, y
    def __eq__(self, o): return (self.x, self.y) == (o.x, o.y)
    def __hash__(self): return hash((self.x, self.y))

pts = {Point(1,2), Point(1,2)}
print(len(pts))  # 1

__add__と算術演算

算術演算子はダンダーメソッドに対応します。たとえば、+ には __add__、- には __sub__ が対応します。

class Vector:
    def __init__(self, x, y): self.x, self.y = x, y
    def __add__(self, o): return Vector(self.x+o.x, self.y+o.y)
    def __repr__(self): return f"Vector({self.x},{self.y})"

print(Vector(1,2) + Vector(3,4))  # Vector(4,6)

インデックス操作のための__getitem__

__getitem__ を使うと、obj[key] のような角括弧によるインデックス操作をクラスでサポートできます。

class Matrix:
    def __init__(self, data):
        self.data = data

    def __getitem__(self, idx):
        return self.data[idx]

m = Matrix([[1,2],[3,4]])
print(m[0])     # [1, 2]
print(m[1][0])  # 3

確認問題

print(obj) を使ったとき、どのダンダーメソッドが呼び出されますか?

復習

マジックメソッドによって、クラスをPythonらしく動作させられます。__repr__ は開発者向け、__str__ はユーザー向けです。__eq__、__hash__、算術演算のダンダーメソッドを定義すると、オブジェクトを十分に機能させられます。

よくある質問

「特殊メソッド: __str__ と __repr__」レッスンは無料ですか?

はい。「特殊メソッド: __str__ と __repr__」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。

「特殊メソッド: __str__ と __repr__」で何を学びますか?

読みやすいオブジェクト表現を返す特殊メソッドを実装します。 ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Python Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「特殊メソッド: __str__ と __repr__」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPython Academyレッスンでコードを書いて実行できますか?

はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. クラスと __init__ メソッド
  2. インスタンス属性とクラス属性
  3. インスタンスメソッドと self
  4. 特殊メソッド: __str__ と __repr__
← Python Academyに戻る