最好在Python中返回或更新对象属性?

时间:2015-01-20 00:05:13

标签: python optimization

我有一个带有更新其对象属性的函数的类。我试图找出哪个更pythonic:我应该明确地返回我更新的对象,还是仅仅更新self对象?

例如:

class A(object):

    def __init__(self):
        self.value = 0

    def explicit_value_update(self, other_value):
        # Expect a lot of computation here - not simply a setter
        new_value = other_value * 2
        return new_value

    def implicit_value_update(self, other_value):
        # Expect a lot of computation here - not simply a setter
        new_value = other_value * 2
        self.value = new_value
        #  hidden `return None` statement

if __name__ == '__main__':
    a = A()
    a.value = a.explicit_value_update(2)
    a.implicit_value_update(2)

我环顾四周,但没有看到任何明确的答案。

编辑:具体来说,我正在寻找可读性和执行时间。这两种功能的任何一个类别都有优势吗?

2 个答案:

答案 0 :(得分:1)

我不认为第一种情况在任何语言中都会被认为是好的。

尝试了解该方法的目的是什么。如果目的是修改对象的状态,那么一定要修改它。如果目的是为调用者提供有用的信息,则返回值。

答案 1 :(得分:0)

a.value = a.explicit_value_update(2)

对我来说很奇怪。

您的..._update方法都没有self个参数,因此无法正常工作。 explicit_value_update不使用任何属性,因此应该是@staticmethod

class A(object):

    def __init__(self):
        self.value = 0

    @staticmethod
    def explicit_value_update(other_value):
        return other_value * 2

这清楚表明它的功能与类有关,但不需要访问类或实例属性。

但我认为做这样的事情的最佳方法是使用属性:

class A(object):

    def __init__(self):
        self.value = 0

    @property
    def value(self):
        return self._value

    @value.setter
    def value(self, other_value):
        self._value = 2 * other_value

if __name__ == '__main__':
    a = A()
    a.value = 2
    print a.value # 4

请注意,现在没有样板 - 您只需直接指定属性,setter就可以为您处理。在Python中常见的是从就地修改它的方法返回对象。