2012-05-28 14 views
11

¿Cómo bloqueo un objeto en Python?Bloquear objetos mutables como inmutables en python

Decir que tengo:

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

me gustaría modificar foo tanto como yo quiero:

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

Pero entonces me gustaría ser capaz de "bloqueo" es tal que, cuando Intento

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

¿Es eso posible en Python?

+0

Buena pregunta; quizás esta publicación es relevante? http://stackoverflow.com/questions/4828080/how-to-make-an-immutable-object-in-python –

+0

Tu pregunta es incoherente. Mire: 't = [2,3]; foo.bar = t; bloqueo (foo); t.append (4) '- ¿debería funcionar, o debería generar una excepción? – Veky

Respuesta

13

Aquí hay una manera simple de hacer esto.

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

¿Puede ofrecer algunos consejos sobre cómo se podría generalizar a un método para hacer que las clases genéricas se bloqueen? Específicamente herencia múltiple vs mezcla vs metaclass – drxzcl

+0

@Ranieri Solo ofrecí esta forma ya que OP no especificó para qué lo usa, por lo que no puedo estar seguro de la mejor manera de implementar la solución. Si hubiera más información, me esforzaría por generalizarla, esta es probablemente la razón por la cual no se han presentado otras soluciones en este momento. Si tiene una respuesta, envíela, por supuesto, pero voy a dejar esto como la solución básica. Si desea agregar información a esto, también estaría bien para mí. – jamylak

+0

Sí, me encantaría aprender sobre una solución genérica. – Gatis

Cuestiones relacionadas