我目前需要部分創建一個Python對象並能夠更新一段時間。雖然,我不能一旦使用該對象作爲字典鍵就能更新它。Python僞不可變對象字段
當然,還有一種解決方案將字段標記爲私有,這對於程序員來說大多是一個警告,我會真正去尋求解決方案。
但是我偶然發現了另一種解決方案,我想知道這是否是一個好主意,或者如果它可能會出現可怕的錯誤。那就是:
class Foo():
def __init__(self, bar):
self._bar = bar
self._has_been_hashed = False
def __hash__(self):
self._has_been_hashed = True
return self._bar.__hash__()
def __eq__(self, other):
return self._bar == other._bar
def __copy__(self):
return Foo(self._bar)
def set_bar(self, bar):
if self.has_been_hashed:
raise FooIsNowImmutable
else:
self._bar = bar
一些測試證明它的工作是需要的話,我可以不再使用set_bar一旦我,說,用我的對象作爲字典的鍵。
您認爲如何?這是個好主意嗎?它會反對我嗎?有更容易的方法嗎?這是一種不好的做法嗎?
如果某人只是在您的對象上調用「hash(obj)」,或者在一個集合中使用它,它也將變得不可變。你還好嗎? – BrenBarn
我想它會沒問題,因爲當你檢索一個對象的散列時,你認爲它永遠不會改變。所以你確實認爲它會被鎖定。 –
注意事項:使用「@屬性」會讓這個更自然;命名爲'bar',讓getter變得微不足道('return self._bar'),並且setter會在執行set之前檢查你的「被鎖定」標誌。 – ShadowRanger