【发布时间】:2018-06-04 12:49:22
【问题描述】:
我想在类的属性设置器中进行一些验证。此属性必须在对象创建期间设置,然后它需要从外部只读。
我找到了以下解决方案,我想知道是否有更直接或 Pythonic 的方法来做到这一点。
(我知道通过从外部调用 user._username 仍然可以设置此属性,但是“我们都是同意的成年人”等 - 重要的是 user.username 不应该有设置器)。
class User:
def __init__(self, username):
self._usernname = username
@property
def username(self):
return self.__username
@property
def _username(self):
return self.__username
@_username.setter
def _username(self, value):
if not value or len(value) < 3:
raise ValueError('Invalid username')
self.__username = value
编辑:除了此处的 cmets,还可在此处找到构造函数中的验证选项:numpy performance and random numbers。
【问题讨论】:
-
只需在构造函数中使用一个下划线检查要存储到
_username中的值,然后完全删除_username属性... -
在
__init__方法中进行所有初始化/验证。额外的_username属性看起来非常虚假,没有实际用途。 -
谢谢@AnttiHaapala,但是如果没有
_username属性,我在哪里可以验证这个值? -
@SamuBalogh。只需将 setter 验证代码移动到
__init__并进行相应调整。去掉两个_username属性函数。 -
@SamuBalogh,
_username属性是 internal 并且应该没有面向外部的 api。它只在__init__中设置一次,因此没有必要为它创建属性。
标签: python validation properties