我目前需要部分创建一个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