2012-05-28 25 views
11

Python'da bir nesneyi nasıl "kilitlerim?"Değiştirilebilir nesneleri python olarak değiştirilemez olarak kilitle

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

Ben istediğim gibi, foo kadar değiştirirdiniz:

Ben Say

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

Ama sonra böyle iken o "kilit" muktedir istiyorum Ben Python'da bu mümkün mü?

+0

İyi soru; belki bu yazı ilgili? http://stackoverflow.com/questions/4828080/how-to-make-an-immutable-object-in-python –

+0

Sorunuz tutarsız. Bak: t = [2,3]; foo.bar = t; (Foo) kilit; t.append (4) '- çalışmalı mı yoksa istisna mı artırmalı? – Veky

cevap

13

İşte bunu yapmanın basit bir yolu.

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

Genel sınıfları kilitlenebilir hale getirmek için bu yöntemin nasıl genelleştirilebileceğine dair bazı ipuçları sunabilir misiniz? Spesifik olarak birden fazla miras vs vs metaclass – drxzcl

+0

@Ranieri Sadece bu şekilde teklif ettim çünkü OP bunu ne için kullandığını belirlemedi, böylece çözümü uygulamanın en iyi yolundan emin olamıyorum. Daha fazla bilgi olsaydı, genelleme çabalarına giderdim, bu muhtemelen bu noktada başka hiçbir çözüm sunulmadı. Eğer bir cevabınız varsa, lütfen onu gönderin, ancak bunu temel çözüm olarak bırakacağım. Buna bilgi eklemek isterseniz, benimle de iyi olur. – jamylak

+0

Evet, genel bir çözüm hakkında bilgi edinmek isterim. – Gatis

İlgili konular