Best way to retrieve data attributes in Python?
我最近有一个问题让我困惑:哪种方法是从外部检索属性的最佳方法。
假设我有一个班级:
1 2 3 4 5 | class Thing: def __init__(self, whatever): self.whatever = whatever x = Thing('foo') |
现在我知道,如果我想检索
1 | x.whatever |
号
我有一个习惯(可能是因为我来自其他OO语言),根据需要定义方法来检索类属性,并使用它们直接检索它们,比如:
1 2 3 4 5 6 | class Thing: def __init__(self, whatever): self.whatever = whatever def getWhatever(self): return self.whatever |
在我的小经历中,我发现使用这种方法从长远来看更容易实现,因为如果我编辑数据属性的结构,我只需要编辑特定的方法。
但由于我不是一个真正的Python老手,我很想知道我是否做得对,或者其他一些方法是否更好,更Python。思想?
在Python中定义显式getter和setter是一种糟糕的实践。而是使用属性:
1 2 3 4 5 6 7 | class Thing(object): # New-style class def __init__(self, whatever): self._whatever = whatever @property def whatever(self): return self._whatever # Insert complicated calculation here |
因此,不要使用get方法进行预先计划,只要在您实际需要高级行为时引入一个属性,而不是更早。
@Phihag有正确的想法,并在他们的答案中提到,但更明确地说:第一步只是直接使用属性:
1 2 3 4 5 6 7 | class Thing(object): def __init__(self, whatever): self.whatever = whatever t = Thing(12) assert t.whatever == 12 |
号
稍后,如果您发现需要使任何属性更复杂,可以将其转换为属性:
1 2 3 4 5 6 7 8 9 10 11 | class Thing(object): def __init__(self, whatever): self._whatever = whatever @property def whatever(self): return something_complicated(self._whatever) t = Thing(12) assert t.whatever == 12 |
这样,调用代码就不会改变,而且对象有一个干净的API。
检查python property()http://docs.python.org/library/functions.html属性