我有一个带有更新其对象属性的函数的类。我试图找出哪个更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)
我环顾四周,但没有看到任何明确的答案。
编辑:具体来说,我正在寻找可读性和执行时间。这两种功能的任何一个类别都有优势吗?
答案 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中常见的是不从就地修改它的方法返回对象。