如果有人试图直接设置 class 实例的变量,则捕获

Catch if someone tries to set a class instance's variable directly

假设我有一个 class 需要对输入变量 x 进行预处理。为此,我在这个 class 中实现了一个函数来设置变量(包括预处理)。为了让算法万无一失,我想知道是否有一种方法可以捕获用户尝试手动设置 x 而不是调用正确函数的尝试。作为一个小的虚拟示例,请考虑以下内容:

class dummy(): 
    def __init__(self, x):
        # This function initializes the instance
        self.x = x
    
    def adjust_x(self):
        # This function makes some change to x
        self.x += 5
        
    def set_x(self, x):
        # This function initializes x correctly
        self.x = x
        self.adjust_x()
        
instance = dummy(3)
print('Initialized correctly, the value of x is: ' + str(instance.x))

# We can also set x later on, using the correct function
instance.set_x(3)
print('Calling the function to set x, we get: ' + str(instance.x))

# However, if the user would try to set x directly, the variable does not get
# correctly adjusted:
instance.x = 3
print('Direct setting: ' + str(instance.x) + ' (/= 8, because instance.adjust_x() was not called)')

有没有办法抓到有人用instance.x设置x?我想在那种情况下提出错误或警告。

在 Python 中,您可以通过在属性前添加双下划线来限制属性的访问(相当于将字段的访问修饰符设置为私有)。

例子

class Object():
  def __init__(self, name):
    self.__name = name

尝试访问 instance.nameinstance.__name 会引发 AttributeError.

备注

正如@mkrieger1 指出的那样,双下划线并不是 用来阻止访问的,但我发现它可以工作。有关 Python 中私有变量的更多信息,请参见 here