我正在编写一个库来解析一个文件,创建一个代表该文件的对象,并允许将该对象导出回一个文件。
我想验证每次更改这些值时是否包含所需的标题和列。因此,我尝试使用 @property 装饰器设置验证。
我注意到在@property 的 python 文档中,如果属性名称是“variable”,他们会使用“_variable”。我知道前面的单个下划线表示该变量仅供弱内部使用。然而,我的印象是 @property 装饰器的要点是任何设置变量的调用都会导致 setter 函数运行。
_headers = None
required_headers = ['FIELD_DELIM', 'VIDEO_FORMAT', 'FPS']
@property
def headers(self):
return self._headers
@headers.setter
def headers(self, value):
for header in self.required_headers:
if header not in value:
raise Exception
self._headers = value
虽然这段代码有效,但我知道我仍然可以通过执行 myObject._headers=value 来绕过我的 setter。
有没有一种方法可以确保始终执行验证而不依赖于用户尊重 _headers 供内部使用?
请您参考如下方法:
Python 并不是为了帮助您“确保”没有人像那样滥用您的对象而设计的。私有(private)属性的下划线前缀,以及将属性隐藏在 getter 和 setter 后面的 @property 机制,可以确保人们不应该那样使用你的对象是显而易见的,并让他们更难不小心这样做,但这无法阻止他们实际上恶意地这样做。
虽然您可以使用一些技巧来更好地隐藏您的属性,但在像 Python 这样高度动态、可自省(introspection)的语言中,总会有一种方法来解决这个问题——直接查看您的 __dict__,或将它们隐藏在任何其他属性中,或者只是将对象的 __class__ 更改为限制较少的内容。
换句话说,如果您只担心您的用户是白痴,您已经可以依赖用户尊重 _headers 供内部使用;如果您担心它们是恶意的,那么 Python 是不适合您的语言。
