我正在轉換舊的Python代碼並用新風格類替換某些類。問題是,這打破了替換__str__
的行爲,我不知道爲什麼。替換新風格類中的__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__
正確返回新的lambda,但str(new)
仍然不會調用它。我認爲這是一些方法查找緩存問題,但即使該對象以前從未打印過,也會發生這種情況。
爲什麼會發生這種情況?我從來沒有聽說過這種行爲差異,它只發生在__str__
,其他方法都被罰款。
用'NewStyle .__ str__ = lambda self:'modified''替換上次修改可按預期工作。我認爲舊式和新式課程的方法解析順序是不同的。 – 2013-04-17 14:11:27
有趣。問題是我只需要在單個實例中替換'__str__'。我想我可以用另一種方式來實施,但我很好奇。 – BoppreH
出於好奇,爲什麼你的代碼首先在實例上代替了'__str__'?聽起來很醜陋。 – geoffspear