在Python中获取数据属性的最佳方法?

9 投票
3 回答
1891 浏览
提问于 2025-04-17 02:29

我最近有个问题一直困扰着我,那就是从外部获取属性的最佳方法是什么。

假设我有一个类:

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

所以,不要提前规划使用获取方法,而是在你真正需要更复杂的功能时再引入属性,而不是更早的时候

撰写回答