Python のマジック メソッドは、Python の __XXX__ 型の事前定義された関数です。
Python のマジック メソッドを使用する最大の利点は、Python がオブジェクトを組み込み型のように動作させる簡単なメソッドを提供することです。
__str__ 関数
__str__ 関数は、インスタンス自体を印刷するときに出力内容を処理するために使用されます。この関数がオーバーライドされていない場合、オブジェクト名とメモリ アドレスがデフォルトで出力されます。
例:
>>> class Student(object): ... def __init__(self,name): ... self._name = name ... >>> print Student()
出力:
<__main__.Student object at 0x0000000002A929E8>.
では、出力結果を読みやすくするにはどうすればよいでしょうか? __str__ 関数をオーバーライドできます。たとえば、
>>> class Student(object): ... def __init__(self, name): ... self._name = name ... def __str__(self): ... return "I'm a student, named %s" % self._name ... >>> print Student("Charlie")
の出力結果は次のようになります。
I'm a student, named Charlie.
str() 関数をオブジェクトに適用すると、実際にはオブジェクトの __str__ 関数が呼び出されます。
__repr__ 関数
__repr__ もオブジェクトをシリアル化しますが、__repr__ は Python コンパイラーが参照するものです。 __str__ の方が読みやすいです。
repr() 関数をオブジェクトに適用するとき、実際に呼び出すのはその関数の __repr__ 関数です。
repr() と対になるのは eval() 関数です。 eval() 関数は、シリアル化されたオブジェクトをオブジェクトに変換して戻します。前提条件は、オブジェクトが __repr__ 関数を実装していることです。
上記の文は私自身の理解に基づくもので、正しいか間違っているかはわかりません。
>>> item = [1,2,3] >>> repr(item) '[1, 2, 3]' >>> other_item = eval(repr(item)) >>> other_item[1] 2
__iter__ function
リストやタプルを反復処理するために for...in... をよく使用します。つまり、リストは Iterable から継承されます。 Iterable は __iter__ 関数を実装します。
カスタム オブジェクトを反復可能なオブジェクトに変換したい場合は、__iter__ と next の 2 つのメソッドを実装する必要があります。
__iter__ 関数はオブジェクトを返します。反復するとき、StopIteration がキャプチャされるまで、次の関数が継続的に呼び出され、次の値が取得されます。
Liao Xuefeng 先生のチュートリアルでは __next__ メソッドが記述されていますが、その理由はわかりません。
class Fib(object): def __init__(self): self.a, self.b = 0, 1 def __iter__(self): return self def next(self): self.a, self.b = self.b, self.a + self.b if self.a > 10000: raise StopIteration return self.a for i in Fib(): print i
__getitem__ function
上記は、__iter__ 関数を実装することでオブジェクトの反復を実装します。
それでは、添え字で要素を抽出するオブジェクトを実装する方法を説明します。
これは、オブジェクトの __getitem__ メソッドを実装することによって行われます。
一つあげましょう