4

古い 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__、他のメソッドは正常に置き換えられます。

4

2 に答える 2