如果有人试图直接设置 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.name
或 instance.__name
会引发 AttributeError
.
备注
正如@mkrieger1 指出的那样,双下划线并不是 用来阻止访问的,但我发现它可以工作。有关 Python 中私有变量的更多信息,请参见 here。
假设我有一个 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.name
或 instance.__name
会引发 AttributeError
.
备注
正如@mkrieger1 指出的那样,双下划线并不是 用来阻止访问的,但我发现它可以工作。有关 Python 中私有变量的更多信息,请参见 here。