在Python中将可变对象锁定为不可变对象

11

如何在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中是否有这种可能?


好问题,也许这篇文章相关?https://dev59.com/IG445IYBdhLWcg3wfKgZ - Steve Tjoa
你的问题不太清晰。看看这段代码:t = [2,3]; foo.bar = t; lock(foo); t.append(4) - 它应该工作还是应该引发异常? - Veky
1个回答

13

以下是一种简单方法。

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()

你能提供一些提示,说明如何将此通用化为一个使泛型类可锁定的方法吗?特别是多重继承 vs 混合 vs 元类。 - drxzcl
@Ranieri 我只提供了这种方式,因为OP没有说明他用这个做什么,所以我不能确定实现解决方案的最佳方法。如果有更多信息,我会努力将其概括,这可能是为什么此时没有其他解决方案被提交的原因。如果您有答案,请提交它,但我将把它作为基本解决方案留下。如果您想添加信息,那对我来说也没问题。 - jamylak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接