質問をします
私たちは、クラス、クラスオブジェクトの印刷をカスタマイズしたり、入力し、このクラスのオブジェクトプレスで情報を入力すると、デフォルトは対話モードに直接表示される便利なようではありません。以下
:[1]では、クラスの人物: ...: デフ __init__ (自己、名前、性別): ...:self.name = 名前 ...:self.sex = セックス ...: では[ 2]:P =人物(' 暁'、' 男性' ) の[ 3 ]:P OUT [ 3]:< __main__ .People 0x7fd0df745400で> [IN 4]:印刷(P) < __main__ 0x7fd0df745400で.Peopleオブジェクト>
二つの方法で見つけることができる情報は、オブジェクトのクラス名であり、オブジェクトのアドレスが配置されている、と非常に多くの場合、これは私たちが望む情報ではない、我々は__str__メソッドと__repr__で書き換えることができ、表示私たちが望む情報をカスタマイズしました。
__str__と__repr__簡単
__str__と__repr__方法、のカスタムクラスの文字列記述子、我々は印刷またはオブジェクトを表示したときに、結果が見終わるにはこれらの2つの方法の戻り値です。これらの2つの方法は、文字列が返されますが、__str__呼び出すときにしていますか?とき__repr__呼び出しますか?我々は、次の例を見て
唯一のクラスはメソッドをオーバーライドする__str__
:[1]において、クラスA: ...: DEF __str__ (自己): ...: リターン ' __str__ ' ...: で[ 2]:A = A() [IN 3 ]: OUT [ 3] < __main__ 0x7ffb3f2ba048で.A> [IN 4]:プリント(A) __str__
対話モードでは、そのオブジェクトに直接入力して、オリジナルと同じで返される結果は、あなたがオブジェクトを印刷するとき、それは方法を__str__トリガ。
唯一のクラスはメソッドをオーバーライドする__repr__
:[1]において、クラスB: ...: DEF __repr__ (自己): ...: リターン ' __repr__ ' :... [IN 2]:B = B() [IN 3 ]:B OUT [ 3] :__repr__ で[ 4]:プリント(B) __repr__
インタラクティブモードでは、オブジェクトに直接入力して、印刷オブジェクトは、メソッドを__repr__トリガされます。
__str__クラスはメソッドと__repr__を上書きします
:[1]において、クラスC: ...: DEF __str__ (自己): ...: リターン ' __str__ ' ... DEF __repr__ (自己): ...: リターン ' __repr__ ' ...: [IN 2]:C = C() の[ 3 ]:C OUT [ 3]:__repr__ で[ 4]:プリント(C) __str__
インタラクティブモードでは、その後__repr__方法をトリガー、オブジェクトに直接入力、印刷オブジェクトは、メソッドを__str__トリガー。
我々は、ビュー・オブジェクト(入力オブジェクトを入力し、Enter)指示したときに関係なくトリガが__repr__方法が何であるかを、要約しないように、カスタムクラスは、このメソッドをオーバーライドしない場合、我々はすべてがデフォルトで新しいクラスでのpython3を知っていますオブジェクトクラスを継承し、その後、時間が__repr__のメソッドオブジェクトを呼び出します。我々は、オブジェクトを印刷するとき、ほとんどの場合はこの方法を__str__トリガされますが、唯一のカスタムクラスは__repr__メソッドをトリガー__repr__メソッドをオーバーライドします。
STR()とのrepr()関数
上記のようにSTR()デフォルトの方法、のrepr()メソッド__repr__デフォルト・トリガ、トリガ機構を__str__トリガ;また、リスト、辞書や他の容器に常に方法は、以下のサンプルコードを__repr__トリガします。
#1 のみ__str__を書き換えるクラスメソッド [5。]:STR(A) OUT [ 5]:' __str__ ' IN [ 6 ]のrepr(A) OUT [ 6]:' <__ __ 0x7ffb3f2ba048オブジェクトATメイン。 > ' #1 のみ__repr__を書き換えるクラスメソッド [5。]:STR(B) OUT [ 5]:' __repr__ ' に[ 6 ]のrepr(B) OUT [ 6]:' __Repr__ ' #のクラスがメソッド__repr__ __str__とオーバーライド での[5 ]:STR(C) OUT [ 5]:' __str__ ' IN [ 6 ]のrepr(C) OUT [ 6]:' __repr__ ' #のリスト、辞書や他の容器は、常に方法__repr__トリガする には、[53である]:印刷([A]) [ < __main__ AT II.Aオブジェクト0x7ffb3f2ba048 > ] 【で 7 STR([C]):] OUT [ 7]:' [__repr__] ' に[ 8 ]のrepr([C]) OUT [ 8]:' [__repr__] ' に[ 9 ]:[C] OUT [ 9]:[ __repr__ ] で[ 10]:プリント([C]) [ __repr__ ]
本質的な違いの__str__と__repr__
その本質的な違いの__str__、最後にそれが何であるか__repr__?公式の説明を見てください
- __str__:によって呼び出さ
str(object)
および組み込み関数format()
やprint()
オブジェクトの「非公式」またはきれいに印字可能な文字列表現を計算します。 - __repr__:によって呼び出され
repr()
たオブジェクトの「公式」の文字列表現を計算する組み込み関数。これは通常、デバッグのために使用されているので、表現は情報が豊富かつ明確であることが重要です。
、非公式のクラスはSTR(STR(オブジェクト))インスタンス化されるオブジェクトを説明する文字列を、読みやすいstr__が呼び出されます__、要約すると、ビルトインされ機能やフォーマット()および印刷()の呼び出し。 __repr__文字列がオブジェクトの公式説明は、ビルトインされている関数のrepr()メソッドを呼び出し、その説明は有益で明確でなければなりません。その結果__str__が読める、__結果がより正確返しrepr__戻りました。例を見てください
[1]:インポート日時 で[ 2]:= Dのdatetime.datetime.now() の[ 3 ]:STR(D) [外 3]:' 08 2019年8月24日:12である:17.942242 ' #可読強力 で[ 4 ]のrepr(D) OUT [ 4]:' datetime.datetimeの(2019 ,. 8、24 ,. 8、12 ,. 17、942 242である)' #の情報は、より正確かつ豊富です
概要
- カスタムクラスにおいて、クラスオブジェクトは__str__と文字列の変換を__repr__するメソッドをオーバーライドすることによってカスタマイズすることができます。
- 一般的に、それは文字列の変換を定義する少なくとも一つのメソッド__repr__カスタマイズ型オブジェクトを追加することをお勧めします、__ str__は任意です。必要に応じてデフォルトので、しかし、メソッドが自動的にメソッドを呼び出します__repr__ __str__見つけることができません。
- ターゲット__str__アプローチは、読みやす__ターゲットrepr__方法が精度であるということです。