在Python中检索数据属性的最佳方法?

时间:2011-09-17 12:52:46

标签: python coding-style

我最近有一个令我困惑的问题是从外部检索属性的最佳方法。

假设我有一个班级:

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。想法?

3 个答案:

答案 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)