在 Python 中将 class 实例属性设置为只读
Make a class instance attribute read-only in Python
我正在尝试将我的一些模块包装到 classes 中并开始使用属性。
正在努力将这两个答案组合在一起:making instance attribute read-only and validating attributes。
我希望能够创建 DataFolder 的实例 class:
df = DataFolder(owner="me", path="/.data")
之后,我希望能够允许编辑 owner
属性,但不允许编辑 path
属性。我希望能够在初始化时(path
和 owner
)和之后(但仅 owner
)验证属性。
class DataFolder(object):
_path = None
#----------------------------------------------------------------------
def __init__(self,owner,path):
self.path = path
self.owner = owner
@property
#----------------------------------------------------------------------
def owner(self):
return self._owner
@owner.setter
#----------------------------------------------------------------------
def owner(self,owner_value):
if "me" not in owner_value:
raise Exception("invalid owner")
self._owner = owner_value
@property
#----------------------------------------------------------------------
def path(self):
return self._path
@path.setter
#----------------------------------------------------------------------
def path(self,path_value):
if self._path is not None:
raise AttributeError("Cannot edit path of existing data folder")
if "dat" not in path_value:
raise Exception("invalid folder")
self._path = path_value
是不是correct/best使用全局变量_path = None
并检查@path.setter
中的if self._path is not None:
?代码运行正常,但我想知道是否有更好的方法。
我觉得不错,除了一件事:_path = None
属于 class。
这只是一个小改进:
class DataFolder(object):
def __init__(self, owner, path):
self._path = None # now it is an instance variable.
self.path = path
self.owner = owner
@property
def owner(self):
return self._owner
def _validate_owner(self, owner_value):
if "me" not in owner_value:
raise ValueError("invalid owner")
@owner.setter
def owner(self, owner_value):
self._validate_owner(owner_value)
self._owner = owner_value
@property
def path(self):
return self._path
def _validate_path(self, path_value):
if self._path is not None:
raise AttributeError("Cannot edit path of existing data folder")
if "dat" not in path_value:
raise ValueError("invalid folder")
@path.setter
def path(self, path_value):
self._validate_path(path_value)
self._path = path_value
使用:
d = DataFolder('me', 'data')
print(d.path, d.owner)
d.path = 'new_data'
输出:
('data', 'me')
new_me
AttributeError: Cannot edit path of existing data folder
我正在尝试将我的一些模块包装到 classes 中并开始使用属性。
正在努力将这两个答案组合在一起:making instance attribute read-only and validating attributes。
我希望能够创建 DataFolder 的实例 class:
df = DataFolder(owner="me", path="/.data")
之后,我希望能够允许编辑 owner
属性,但不允许编辑 path
属性。我希望能够在初始化时(path
和 owner
)和之后(但仅 owner
)验证属性。
class DataFolder(object):
_path = None
#----------------------------------------------------------------------
def __init__(self,owner,path):
self.path = path
self.owner = owner
@property
#----------------------------------------------------------------------
def owner(self):
return self._owner
@owner.setter
#----------------------------------------------------------------------
def owner(self,owner_value):
if "me" not in owner_value:
raise Exception("invalid owner")
self._owner = owner_value
@property
#----------------------------------------------------------------------
def path(self):
return self._path
@path.setter
#----------------------------------------------------------------------
def path(self,path_value):
if self._path is not None:
raise AttributeError("Cannot edit path of existing data folder")
if "dat" not in path_value:
raise Exception("invalid folder")
self._path = path_value
是不是correct/best使用全局变量_path = None
并检查@path.setter
中的if self._path is not None:
?代码运行正常,但我想知道是否有更好的方法。
我觉得不错,除了一件事:_path = None
属于 class。
这只是一个小改进:
class DataFolder(object):
def __init__(self, owner, path):
self._path = None # now it is an instance variable.
self.path = path
self.owner = owner
@property
def owner(self):
return self._owner
def _validate_owner(self, owner_value):
if "me" not in owner_value:
raise ValueError("invalid owner")
@owner.setter
def owner(self, owner_value):
self._validate_owner(owner_value)
self._owner = owner_value
@property
def path(self):
return self._path
def _validate_path(self, path_value):
if self._path is not None:
raise AttributeError("Cannot edit path of existing data folder")
if "dat" not in path_value:
raise ValueError("invalid folder")
@path.setter
def path(self, path_value):
self._validate_path(path_value)
self._path = path_value
使用:
d = DataFolder('me', 'data')
print(d.path, d.owner)
d.path = 'new_data'
输出:
('data', 'me')
new_me
AttributeError: Cannot edit path of existing data folder