マジックメソッド入門
CoddyのPythonジャーニー「Object Oriented Programming」セクションの一部 — レッスン 33/64。
マジックメソッド(ダンダーメソッドとも呼ばれます)は、最初と最後に2つのアンダースコアが付いた特殊なメソッドです。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らしく(Pythonic)、直感的に使用できるようになります。
チャレンジ
簡単このチャレンジでは、マジックメソッドを使用した Counter クラスを実装します。
counter.py- 編集が必要なファイルです。実装のガイドとなる TODO コメントが含まれています。driver.py- 広範なテストケースが含まれています。
TODO コメントに従って、counter.py で Counter クラスを、driver.py でテストケースを実装してください。このクラスは、オプション値による初期化、文字列表現、および加算操作をサポートする必要があります。
チートシート
マジックメソッド(特殊メソッド)は、特定の操作に応じてPythonが自動的に呼び出す、ダブルアンダースコアで囲まれた特別なメソッドです。
一般的なマジックメソッド:
__init__- オブジェクトの作成時に呼び出されます__str__-str()やprint()で文字列に変換される際に呼び出されます__len__-len()関数を使用する際に呼び出されます
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(my_book) # 自動的に __str__ を呼び出します
print(len(my_book)) # 自動的に __len__ を呼び出します__str__ がないと、出力時に読みやすい形式ではなく、オブジェクトのメモリ上の場所が表示されます。
自分で試してみよう
# 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のカウンターに浮動小数点数 (2.5) を加えてみてください
# 期待される出力: "Count: 7.5"
passこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。