如何在Python中阻止私有变量的读取?

9 浏览
0 Comments

如何在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尽管如此,这似乎效率不高。有更好的方法吗?

0
0 Comments

问题的原因是,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中,无法完全阻止用户访问私有变量。

0