在Python中获取数据属性的最佳方法?
我最近有个问题一直困扰着我,那就是从外部获取属性的最佳方法是什么。
假设我有一个类:
class Thing:
def __init__(self, whatever):
self.whatever = whatever
x = Thing('foo')
现在我知道,如果我想获取 whatever
这个属性,我可以这样做:
x.whatever
我有一个习惯(可能是因为我之前用过其他面向对象的语言),就是定义一些方法来获取类的属性,而不是直接获取,比如:
class Thing:
def __init__(self, whatever):
self.whatever = whatever
def getWhatever(self):
return self.whatever
根据我一点点的经验,我发现使用这种方法在长期维护上会更简单,因为如果我修改了数据属性的结构,我只需要修改特定的方法就可以了。
不过,由于我并不是一个资深的 Python 用户,我很想知道我这样做是否正确,或者有没有其他更好的、更符合 Python 风格的方法。你们怎么看?
3 个回答
0
查看 Python 的 property() 函数 http://docs.python.org/library/functions.html#property
8
@phihag 的想法很不错,他在回答中提到了这一点,但我想更明确地说一下:第一步就是直接使用这个属性:
class Thing(object):
def __init__(self, whatever):
self.whatever = whatever
t = Thing(12)
assert t.whatever == 12
之后,如果你发现需要让这个属性变得更复杂一些,你可以把它变成一个属性方法:
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
这样,调用这个代码的部分就不用改动了,你的对象接口也会变得更加简洁明了。
14
在Python中,定义明确的获取器(getters)和设置器(setters)被认为是一种不好的做法。相反,应该使用属性(properties):
class Thing(object): # New-style class
def __init__(self, whatever):
self._whatever = whatever
@property
def whatever(self):
return self._whatever # Insert complicated calculation here
所以,不要提前规划使用获取方法,而是在你真正需要更复杂的功能时再引入属性,而不是更早的时候。