このような__slots__が__xxx__変数や関数名のように似た形を参照してくださいこれらはPythonで特別な目的であることに留意されたいです
Pythonの私たちにカスタムクラスを助けることができる多くの特別な目的の機能があります。
__str__
学生は、印刷のインスタンスをクラスを定義します
>>>クラスの学生(オブジェクト): ...デフ__init __(自己、名): ... self.name =名 ... >>>印刷(学生( 'Zhangsan')) <__ __メイン0x7f8a4830a748の学生対象。 >
<0x7f8a4830a748で。学生対象__ __メイン>プリントアウト非直感的で、良い見ていません
どのように素敵なそれを印刷するには?あなただけがそれで素敵な文字列を返すように__str __()メソッドを定義する必要があります
>>>クラスの学生(オブジェクト): ...デフ__init __(自己、名): ... self.name =名 ... DEF __str __(自己): ...リターン「学生のオブジェクト(名:%sの) '%のself.name ... >>> >>>印刷(学生(' Zhangsan ')) 学生のオブジェクト(名前:Zhangsan)
そのようなプリントアウトの例としては、唯一の格好良い、とインスタンスの重要なデータの内部を見ることは容易ではありません
しかし、直接には、端末の代わりに、印刷で変数をノック、またはそれをプリントアウトしている場合は良い見ていません
>>>学生( 'Zhangsan') <0x7f8a4830a8d0で__ __メイン。学生対象>
これは、コールが直接変数を表示されていないためである__str__()
、しかし__repr__()
、違いがされ__str__()
た文字列を見るために、ユーザーに返され、__repr__()
それは、ある、見に文字列のプログラム開発者を返す__repr__()
サービスをデバッグするため。
溶液は、第二を定義することです__repr__()
。しかし、通常__str__()
、および__repr__()
コードは同じなので、怠惰な文言があります:
>>>クラスの学生(オブジェクト): ...デフ__init __(自己、名): ... self.name =名 ... DEF __str __(自己): ...リターン「学生のオブジェクト(名:%sの) '%self.name ... __repr __ = __ str__ ... >>> >>>学生(' Zhangsan ') 学生のオブジェクト(名前:Zhangsan)
__iter__
あなたがそのリストやタプルに似たこのfor..inループで使用するクラスを、必要な場合は、イテレータオブジェクトを返す__iter __()メソッドを実装する必要があり、その後、ループ反復のためのPythonはオブジェクトを呼び出すしていきますそれがエラーを呼び出すとStopIteration出口をループに遭遇するまで__next __()メソッドは、値の次のサイクルを取得します
FIBクラス(オブジェクト): DEF __init __(自己): #は二つのカウンタの初期化 、self.b = 0、1 self.aを DEF __iterの__(自己を): #繰り返しオブジェクトのインスタンス自体が、彼らに戻るには リターン自己 __nextの__ DEF(セルフ) : self.a、self.b、self.b、=、+ self.b、self.aの #セットループ終了条件 IF self.a> 10000: 昇給を呼び出すとStopIteration() 戻りself.a におけるn-FIB()のために: プリント(N- )
輸出
>>> FIBにnの(): ...プリント(N) ... 1 1 2 3 5 ... 46368 75025
__grtitem__
Fibなお、実施例は、第5要素を取り、例えば、リストとして、またはしないそれを使用するために、しかし、ループのために機能し、幾分リストのように見えることができ
>>>のFib()[5] トレースバック(最新の呼び出しの最後): <モジュール>内のファイル"<STDIN>"、1行目は、 TypeError例外: 'のFib'オブジェクトは、添字化ではありません
__getitem __()メソッドを達成するために必要に応じて、要素の性能指標として、上記のリストを削除するには
special_getitem.py
クラスのFib(オブジェクト): DEF __getitem __(自己、N) 、B = 1,1 範囲内のxの(N) 、B = B + B 返します
さて、あなたはのいずれかをマーク列にアクセスするために任意の番号を押すことができます
>>> F [0] 1つの >>> F [1] 1つの >>> F [100] 573147844013817084101
しかし、決定のFibスライスエラーに対応するメソッドのリストがあります
>>> [1:5] F トレースバック(最新の呼び出しの最後): ファイル"<STDIN>"、<モジュール>の行1、 __getitem__でファイル"<STDIN>"、4行目、 TypeError例外: 'スライス'オブジェクトできません整数として解釈されます