Menu
CoddyTech

マジックメソッド入門

CoddyのPythonジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 33/64。

マジックメソッド(ダンダーメソッドとも呼ばれます)は、先頭と末尾が二重アンダースコアになっている特別なメソッドです。Pythonは、特定の操作に応じてこれらを自動的に呼び出します。

マジックメソッドを持つクラスの例を次に示します。

class Book:
    def __init__(self, title, author, pages):
        self.title = title
        self.author = author
        self.pages = pages
    
    def __str__(self):
        return f"{self.title} by {self.author}"

オブジェクトを作成すると、__init__メソッドが自動的に呼び出されます。

my_book = Book("Python Programming", "John Smith", 350)

オブジェクトを文字列に変換すると、__str__メソッドが自動的に呼び出されます。

print(my_book)        # 自動的に__str__を呼び出す
print(str(my_book))   # こちらも__str__を呼び出す

出力:

Python Programming by John Smith
Python Programming by John Smith

__str__がないと、オブジェクトを出力するとメモリ上の位置が表示されます。

class SimpleBook:
    def __init__(self, title):
        self.title = title

simple = SimpleBook("Test Book")
print(simple)  # <__main__.SimpleBook object at 0x...>

長さを取得する別の特殊メソッドを追加します:

class Book:
    def __init__(self, title, author, pages):
        self.title = title
        self.author = author
        self.pages = pages
    
    def __str__(self):
        return f"{self.title} by {self.author}"
    
    def __len__(self):
        return self.pages

my_book = Book("Python Programming", "John Smith", 350)
print(len(my_book))   # __len__を自動的に呼び出す

出力:

350

重要なポイント: マジックメソッドは二重アンダースコアで始まり、終わります(__method__)。また、Python によって自動的に呼び出されます。これにより、オブジェクトを str()、len() などの組み込み関数や演算子と連携させることができ、クラスをより Python らしく、直感的に使えるようになります。

challenge icon

チャレンジ

簡単

このチャレンジでは、マジックメソッドを持つCounterクラスを実装します。

  • counter.py - 編集する必要があるファイルです。実装の指針となるTODOコメントが含まれています
  • driver.py - 多数のテストケースが含まれています

次の内容を実装してください。counter.pyのCounterクラスと、TODOコメントに従ったdriver.pyのテストケース。クラスは、値を省略できる初期化、文字列表現、加算演算をサポートする必要があります。

自分で試してみよう

# TODO: counter.py から Counter クラスをインポートする
# 次の形式を使用する: from counter import Counter

# 総合的なテストケースの処理
test_case = input()

if test_case == "init_test":
    # TODO: デフォルト値での初期化をテストする
    # 引数なしでカウンターを作成し、表示する
    # 期待される出力: "Count: 0"
    pass

elif test_case == "init_with_value":
    # TODO: 指定した値での初期化をテストする
    # 初期値 10 のカウンターを作成し、表示する
    # 注: print() は暗黙的に __str__ を呼び出すが、ここでは __init__ のテストに焦点を当てる
    # 期待される出力: "Count: 10"
    pass


elif test_case == "addition":
    # TODO: 加算演算をテストする
    # 値が 3 のカウンターを作成し、7 を加えて結果を表示する
    # 期待される出力: "Count: 10"
    pass

elif test_case == "chained_addition":
    # TODO: 連続した加算演算をテストする
    # 値が1のカウンターを作成し、2を加え、その結果に3を加えて表示する
    # 期待される出力: "Count: 6"
    pass

elif test_case == "negative_values":
    # TODO: 負の値でテストする
    # 値が-5のカウンターを作成して表示する
    # 次に-3を加え、結果を表示する
    # 期待される出力: "Count: -5" と "Count: -8"
    pass

elif test_case == "zero_value":
    # TODO: ゼロの値でテストする
    # 値が0のカウンターを作成し、0を加えて表示する
    # 期待される出力: "Count: 0"
    pass

elif test_case == "large_values":
    # TODO: 大きな値でテストする
    # 値が1000000のカウンターを作成し、9000000を加える
    # 期待される出力: "Count: 10000000"
    pass

elif test_case == "multiple_counters":
    # TODO: 複数のカウンター間の相互作用をテストする
    # 値が5のcounter1と、値が10のcounter2を作成する
    # 両方のカウンターを表示する
    # 期待される出力: "Count: 5" と "Count: 10"
    pass

elif test_case == "type_validation":
    # TODO: 異なる型の値を加算するテスト
    # 値が5のカウンターにfloat(2.5)を加算してみる
    # 期待される出力: "Count: 7.5"
    pass
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Pythonオンラインコンパイラ