マジックメソッド入門
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 らしく、直感的に使えるようになります。
チャレンジ
簡単このチャレンジでは、マジックメソッドを持つ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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Pythonオンラインコンパイラ