2012-05-28 49 views
11

如何在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中可能吗?

+0

好问题;也许这个帖子是相关的? http://stackoverflow.com/questions/4828080/how-to-make-an-immutable-object-in-python –

+0

你的问题是不连贯的。看:'t = [2,3]; foo.bar = t;锁(FOO); t.append(4)' - 它应该工作,还是应该引发异常? – Veky

回答

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

你可以提供一些关于如何将其推广到一个方法来使泛型类可锁定的一些技巧吗?特别是多继承vs混合vs元类 – drxzcl

+0

@Ranieri我只提供这种方式,因为OP没有具体说明他使用的是什么,所以我无法确定实现解决方案的最佳方式。如果有更多的信息我会去推广它,这可能就是为什么在这个时候没有提交其他解决方案。如果你有答案,然后提交它,但我只是将这作为基本的解决方案。如果您想为此添加信息,那也可以。 – jamylak

+0

是的,我很想了解一个通用的解决方案。 – Gatis