我试图将一些模块包装到类中,并开始玩属性。在Python中创建一个类实例属性只读
将这两个答案组合在一起:making instance attribute read-only和validating attributes。
我希望能够创造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:
?代码工作正常,但我想知道是否有更好的方法。
这似乎是一个合理的方式做到这一点 - 这是一个*类属性*,不是*全局变量*。尽管如此,我会提出一个'ValueError'而不是基于'Exception'作为无效参数。由于这看起来是有效的代码,你可能会更好[codereview.se]。 – jonrsharpe
谢谢!将使用ValueError来代替。它在私有变量前面的“_”变得混乱,但我希望习惯它们:) –