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

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是供内部使用?

aba*_*ert 7

Python并非旨在帮助您"确保"没有人滥用您的对象.私有属性的下划线前缀,以及@property隐藏getter和setter背后的属性的机制,可以确保人们显然不应该使用这样的对象,并使他们更难以意外地执行此操作,但它不能防止他们真实地恶意这样做.

虽然有一些技巧可以用来更好地隐藏你的属性,但是在一种高度动态,内省的语言中,如Python,总会有一种方法可以直接在你的内容中__dict__,或者你隐藏它们的任何其他属性. ,或者只是__class__将对象更改为限制较少的对象.

换句话说,如果您担心的是您的用户是白痴,您已经可以依赖用户尊重_headers内部使用; 如果你担心它们是恶意的,那么Python对你来说就是错误的语言.

  • @KEngle这就是doc字符串的用途.:) (2认同)
  • @KEngle:如果您正在编写新手使用的代码,并希望他们将代码用作自己的文档,您可能希望添加一些额外的注释,例如`self._headers = None#不设置此项直接在您的代码中,使用spam.header属性或类似的,以及列出公共属性(无论是真实的还是`@ property`)的文档字符串. (2认同)