2012-05-28 12 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

ジェネリッククラスをロック可能にする方法にこれを一般化する方法についていくつかのヒントを提供できますか?特に多重継承とミキシングとメタクラスの比較 – drxzcl

+0

@Ranieri私はOPが彼がこれをどのように使用しているのかを特定していないので、私はこの方法を提案しました。私はソリューションを実装する最良の方法を確信できません。私が一般化しようとするより多くの情報があれば、これはおそらく他の解決策が現時点で提出されていない理由です。答えがあればそれを提出してください。しかし、これを基本的な解決策として残しておきます。あなたがこれに情報を追加したいのであれば、それは私にとってもうまくいくでしょう。 – jamylak

+0

ええ、ジェネリックなソリューションについて知りたいです。 – Gatis

関連する問題