2

类中的方法应该使用属性/设置器访问器,例如“add_to_field”还是应该直接访问私有变量,例如“从字段中减去”?

class Example(object):
    def __init__(self, field):
        self._field = field

    @property
    def field(self):
        return self._field

    @field.setter
    def field(self, field):
        self._field = field

    def add_to_field(self, something):
        self.field += something

    def subtract_from_field(self, something):
        self._field += something

如果 setter 没有纯粹设置变量,而是执行其他操作,例如日志记录,那又如何呢?这是不好的风格吗?

    @field.setter
    def field(self, field):
        log.logger.debug("Field set to %r", field)
        self._field = field

目前我的代码是两者的混合。不确定重构的方向。

4

1 回答 1

3

避免使用 getter 和 setter 的主要原因是避免潜在的无限递归(您的 setter 调用设置对象的方法 foo,调用 foo 等)。

否则,最好始终调用 getter/setter,以确保您的程序数据保持一致。

我的建议是:一直使用你的 getter/setter。如果您在某一点开始使用复杂的设置器并且第一点成为问题,那么您应该尝试重新考虑您的代码以使其保持简单。另一种方法可以重构在 setter 中完成的所有繁重工作。

如果您的 getter/setter 正是“返回值”和“为变量赋值”,那么您不应该定义任何 getter 或 setter。Python 的一个优点是,在您需要 getter 或 setter 的那一天,您将能够完全透明地完成它。这就是为什么在 C++ 中,有时通过 getter 和 setter 访问属性有时被认为是一种很好的做法,即使它们只是“虚拟”函数。

总结一下:我会选择这种add_to_field风格。

于 2013-04-17T07:41:12.420 回答