マジックメソッド__str__と__repr__でPythonの違い

 

質問をします

私たちは、クラス、クラスオブジェクトの印刷をカスタマイズしたり、入力し、このクラスのオブジェクトプレスで情報を入力すると、デフォルトは対話モードに直接表示される便利なようではありません。以下

:[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__方法が精度であるということです。

おすすめ

転載: www.cnblogs.com/miaoning/p/11399575.html