Skip to main content
 首页 » 编程设计

python之有没有办法确保对变量执行验证而不是@property

2025年05月04日9freeliver54

我正在编写一个库来解析一个文件,创建一个代表该文件的对象,并允许将该对象导出回一个文件。

我想验证每次更改这些值时是否包含所需的标题和列。因此,我尝试使用 @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 是不适合您的语言。