【发布时间】:2016-02-02 11:45:20
【问题描述】:
我正在尝试将我的一些模块包装到类中并开始使用属性。
努力将这两个答案结合在一起: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。由于这似乎是有效的代码,您可能会在Code Review 上做得更好。 -
谢谢!将使用 ValueError 代替。私有变量前面的“_”越来越令人困惑,但我希望习惯它们:)
标签: python class oop properties attributes