如何在Python中阻止私有变量的读取?
如何在Python中阻止私有变量的读取?
我正在尝试在Python中安全地执行JavaScript代码,使用pyv8
。最终,我有一个被JavaScript使用的对象,其中有一些我想要隐藏的字段。\n我知道Python没有封装性(如(在这个问题中解释)),但是否有办法使用__getattribute__
禁用访问?\n
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)
\n所以这个对象拒绝访问“私有”变量,除非使用以下方法解锁:\n
ctx = Context() ... with ctx: # _b在这里是可访问的 print ctx._b
\n由于无法从JavaScript中执行with
,也无法调用__enter__
,因为该对象是“锁定”的。\n尽管如此,这似乎效率不高。有更好的方法吗?
问题的原因是,Python中无法完全阻止用户访问私有变量。即使使用属性getter限制访问,用户仍然可以通过访问对象的引用来获取私有变量的值。这是因为Python不支持完全的沙盒执行模式。
解决方法是使用属性装饰器`property`来创建一个getter,并在getter中限制访问私有变量。但是需要注意的是,这并不能完全阻止用户访问私有变量,只能增加访问的限制。以下是一个示例代码:
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
更多信息可以在这里找到:https://docs.python.org/3/library/functions.html#property
然而,需要注意的是,即使使用上述方法限制了访问私有变量的方式,用户仍然可以通过访问对象的引用来获取私有变量的值。这是因为Python不支持完全的沙盒执行模式。在Python中,无法完全阻止用户访问私有变量。