[英]Make a class instance attribute read-only in Python
我試圖將我的一些模塊包裝到類中,並開始使用屬性。
將這兩個答案結合在一起的工作: 使實例屬性為只讀,並驗證屬性 。
我希望能夠創建DataFolder類的實例:
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
使用全局變量_path = None
並檢查@path.setter
if self._path is not None:
是否正確/最佳? 該代碼工作正常,但我想知道是否有更好的方法。
對我來說,這很不錯,除了以下_path = None
: _path = None
屬於一個類。
這只是一個小的改進:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.