私は安全に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
オブジェクトは「ロックされています」。
非常に効率的ではないようですね。より良い方法がありますか?
名前マングリングは、Pythonでのプライベート変数のすべての有効なユースケースをカバーします。 – Natecat
'__foo'のような変数は、それらが含まれているクラスの外でコードに簡単には見えないように、マングルされています(あなたはそれを回避することはできますが)。 「__」は、「技術的にそうすることができなくても、離れていなくて」ということです。 – mmenschig
はい、 '__a'は実際にはコンパイラによって '_A__a'として利用可能です。私が望むのは、文字通り価値を得るための方法を無効にすることです。 – desertkun