问题 将可变对象锁定为python中的不可变对象


如何在Python中“锁定”对象?

说我有:

class Foo:
  def __init__(self):
    self.bar = []
    self.qnx = 10

我会尽可能多地修改foo:

foo = Foo()
foo.bar.append('blah')
foo.qnx = 20

但是,当我尝试时,我希望能够“锁定”它

lock(foo)
foo.bar.append('blah')  # raises some exception.
foo.qnx = 20            # raises some exception.

这可能在Python中吗?


4478
2018-05-28 02:42


起源

好问题;也许这篇文章是相关的? stackoverflow.com/questions/4828080/... - Steve Tjoa
你的问题是不连贯的。看: t = [2,3]; foo.bar = t; lock(foo); t.append(4)  - 它应该工作,还是应该引发异常? - Veky


答案:


这是一种简单的方法。

class Foo(object):
    def __init__(self):
        self._bar = []
        self._qnx = 10
        self._locked= False

    @property
    def locked(self):
        return self._locked

    def lock(self):
        self._locked = True

    @property
    def bar(self):
        if self.locked:
            return tuple(self._bar)
        return self._bar

    @property
    def qnx(self):
        return self._qnx
    @qnx.setter
    def qnx(self,val):
        if self.locked:
            raise AttributeError
        self._qnx = val

def lock(obj):
    obj.lock()

13
2018-05-28 03:08



您能否提供一些提示,说明如何将此概括为一种使通用类可锁定的方法?特别是多重继承vs混合与元类 - drxzcl
@Ranieri我只提供这种方式,因为OP没有具体说明他使用的是什么,所以我不能确定实现解决方案的最佳方法。如果有更多的信息我会去推广它,这可能就是为什么此时还没有提交其他解决方案的原因。如果您有答案,那么当然要提交它,但我只是将其作为基本解决方案。如果您想向此添加信息,那对我来说也没问题。 - jamylak
是的,我很想学习通用的解决方案。 - Igor Gatis