我最近有一个令我困惑的问题是从外部检索属性的最佳方法。
假设我有一个班级:
class Thing:
def __init__(self, whatever):
self.whatever = whatever
x = Thing('foo')
现在我知道如果我想要检索whatever
属性,我可以这样做:
x.whatever
我有习惯(可能是因为我来自其他oo语言)来定义根据需要检索类属性的方法,并使用它们直接检索它们,例如:
class Thing:
def __init__(self, whatever):
self.whatever = whatever
def getWhatever(self):
return self.whatever
根据我的经验,我发现使用这种方法可以使事情更容易长期保存,因为如果我编辑数据属性的结构,我只需要编辑特定的方法。
但是因为我不是真正的蟒蛇老兵,所以我很想知道我是不是做对了,或者其他一些方法是否更好,更py。想法?
答案 0 :(得分:13)
在Python中定义显式getter和setter是bad practice。相反,请使用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
因此,不要使用get方法进行预先规划,只需在实际需要高级行为时引入属性,并not any earlier。
答案 1 :(得分:8)
@phihag有正确的想法,并在他们的回答中提到,但更明确一点:第一步只是直接使用该属性:
class Thing(object):
def __init__(self, whatever):
self.whatever = whatever
t = Thing(12)
assert t.whatever == 12
稍后,如果您发现需要使any属性更复杂,可以将其转换为属性:
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。
答案 2 :(得分:0)