3

2つの方法に違いはありますか?

例えば、

from datetime import date
today = date(2012, 10, 13)
repr(today)
'datetime.date(2012, 10, 13);

today.__repr__()
'datetime.date(2012, 10, 13)'

彼らは同じことをしているように見えますが、なぜ誰かが通常の表現よりも後者を使いたいのでしょうか?

4

2 に答える 2

11

__repr__メソッドは、のカスタム結果を実装するために使用されrepr()ます。repr()、によって使用されますstr()__str__定義されていない場合)。__repr__明示的に呼び出すべきではありません。

違いは、repr()が返された型として文字列を強制し、repr()が__repr__インスタンス自体ではなくクラスオブジェクトを検索することです。

>>>> class C(object):
....   def __repr__(self):
....     return 1 # invalid non-string value
....
>>>> c = C()
>>>> c.__repr__() # works
1
>>>> repr(c) # enforces the rule
Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeError: __repr__ returned non-repr (type 'int')
>>>> c # calls repr() implicitly
Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeError: __repr__ returned non-repr (type 'int')
>>>> str(c)  # also uses __repr__
Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeError: __str__ returned non-str (type 'int')
>>>> c.__repr__ = lambda: "a"
>>>> c.__repr__() # lookup on instance
'a'
>>>> repr(c) # old method from the class
Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeError: __repr__ returned non-repr (type 'int')
>>>>
于 2012-10-13T22:53:55.043 に答える
4

それは同じことです

repr()次のコードが含まれていると考えてください。

def repr(obj):
    return obj.__repr__()

オブジェクトの__repr__()関数を呼び出すだけです。__repr__()オブジェクトのメソッドを明示的に呼び出す必要がある理由がわかりません。実際、そうするのは一般的に悪いコーディング スタイルです (混乱を招き、プログラマーが今あなたがしたような質問をするようになります)。

于 2012-10-13T22:34:18.323 に答える