2017-01-26 18 views
0

私は安全にpyv8を使用して、Pythonでjavascriptコードを実行しようとしています。その日の終わりに、私はオブジェクトをjavascriptで使用していますが、私は隠したいフィールドはほとんどありません。プライベート変数の読み込みをPythonで拒否するにはどうすればよいですか?

私はPythonがカプセル化を持たないことを知っています(as explained in this question)しかし、まだ、__getattribute__を使用してアクセスを無効にする方法はありますか?ロックを解除しない限り、

class Context(object): 
    def __init__(self, debug): 
     self._a = ... 
     self._b = ... 
     self._c = ... 
     self._unlocked = False 

    def __enter__(self): 
     self._unlocked = True 

    def __exit__(self, exc_type, exc_val, exc_tb): 
     self._unlocked = False 

    def __getattribute__(self, name): 
     if object.__getattribute__(self, "_unlocked"): 
      return object.__getattribute__(self, name) 

     if name.startswith("_"): 
      return None 

     return object.__getattribute__(self, name) 

だから、このオブジェクトは、次のように使用して、「プライベート」の変数へのアクセスを拒否します:

限りがJavaScriptから withを行うには方法はません、また以来 __enter__を呼び出すこととして
ctx = Context() 
... 
with ctx: 
    # _b is accessible here 
    print ctx._b 

オブジェクトは「ロックされています」。

非常に効率的ではないようですね。より良い方法がありますか?

+1

名前マングリングは、Pythonでのプライベート変数のすべての有効なユースケースをカバーします。 – Natecat

+0

'__foo'のような変数は、それらが含まれているクラスの外でコードに簡単には見えないように、マングルされています(あなたはそれを回避することはできますが)。 「__」は、「技術的にそうすることができなくても、離れていなくて」ということです。 – mmenschig

+0

はい、 '__a'は実際にはコンパイラによって '_A__a'として利用可能です。私が望むのは、文字通り価値を得るための方法を無効にすることです。 – desertkun

答えて

0

アクセスを制限するプロパティゲッターを使用できますか?

class Context(object): 
    def __init__(self): 
     self._x = None 

    @property 
    def x(self): 
    """I'm the 'x' property.""" 
     return "Property can not be accessed." 

    @x.setter 
    def x(self, value): 
     self._x = value 

    @x.deleter 
    def x(self): 
     del self._x 

詳細情報はここで見つけることができます:2つの先頭のアンダースコアによって行わ https://docs.python.org/3/library/functions.html#property

+1

これは、ユーザーが 'foo._x'にアクセスするのを妨げないということです。 – Lagerbaer

+1

ユーザが 'foo'への参照を持っている場合、' foo'のデータのいずれかにアクセスできます。このため、Pythonはもはやサンドボックス化された実行モードを持つふりをしていません。あなたが求めているのは、Pythonでは不可能です。 – cco

関連する問題