关于编码风格:在Python中检索数据属性的最佳方法?

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')

现在我知道,如果我想检索whatever属性,我可以这样做:

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属性