古い Python コードを変換し、一部のクラスを新しいスタイル クラスに置き換えました。問題は、これが置換の動作を壊したことであり、__str__
その理由はわかりません。
class OldStyle():
def __str__(self):
return 'original'
old = OldStyle()
print old
old.__str__ = lambda: 'modified'
print old
class NewStyle(object):
def __str__(self):
return 'original'
new = NewStyle()
print new
new.__str__ = lambda: 'modified'
print new
期待した
original
modified
original
modified
しかし、私は得ました
original
modified
original
original
つまり__str__
、新しいスタイルで正しく置き換えられませんでした。印刷new.__str__
は新しいラムダを正しく返しますが、str(new)
まだ呼び出しません。メソッドルックアップのキャッシュの問題だと思っていましたが、これはオブジェクトが以前に印刷されたことがない場合でも発生します。
なぜそれが起こるのですか?この動作の違いについて聞いたことがなく、それは でのみ発生し__str__
、他のメソッドは正常に置き換えられます。