K E*_*gle 1 python validation properties
我正在编写一个解析文件的库,创建一个表示文件的对象,并允许将对象导出回文件.
我想验证每次更改这些值时都包含所需的标题和列.因此,我试图使用@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
Run Code Online (Sandbox Code Playgroud)
虽然这段代码有效,但我知道我仍然可以通过执行myObject._headers = value来绕过我的setter.
有没有办法可以确保始终执行验证而不依赖于用户尊重_headers是供内部使用?
Python并非旨在帮助您"确保"没有人滥用您的对象.私有属性的下划线前缀,以及@property
隐藏getter和setter背后的属性的机制,可以确保人们显然不应该使用这样的对象,并使他们更难以意外地执行此操作,但它不能防止他们真实地恶意这样做.
虽然有一些技巧可以用来更好地隐藏你的属性,但是在一种高度动态,内省的语言中,如Python,总会有一种方法可以直接在你的内容中__dict__
,或者你隐藏它们的任何其他属性. ,或者只是__class__
将对象更改为限制较少的对象.
换句话说,如果您担心的是您的用户是白痴,您已经可以依赖用户尊重_headers
内部使用; 如果你担心它们是恶意的,那么Python对你来说就是错误的语言.