在Python中函数间传值的最佳实践
在Python中,怎样做才算是最好的实践,让一个函数能够使用另一个函数返回的值呢?比如,是在一个函数里面直接调用另一个函数好,还是让第一个函数返回值给一个类,然后把这些值赋给类的变量,再让第二个函数使用这些变量更好呢?另外,有多少种不同的方法可以在函数之间传递值呢?
class adding:
def get_values(self):
x = input("input x")
y = input("input y")
z = input("input z")
return x, y, z
def use_values(self, x, y, z):
print x+y+z
if name == 'main':
dave = adding()
x, y, z = dave.get_values()
dave.use_values(x, y, z)
或者
dave = adding()
dave.use_values(*dave.get_values())
3 个回答
我认为 get_values
这个功能并不是添加功能中必不可少的部分,所以它应该单独作为一个函数。如果一定要放在一起的话,我觉得:
class adding:
def get_values(self):
self.x = input("input x")
self.y = input("input y")
self.z = input("input z")
def use_values(self):
print self.x+self.y+self.z
if name == 'main':
dave = adding()
dave.get_values()
dave.use_values()
这样做会更合理。
所有的方法都是有效的,完全取决于你的主题领域和功能的划分,也就是关注点的分离。换句话说,这要看情况。
举个例子,你可以有一个类,它的公共接口有两个方法,这两个方法都依赖于一个你认为是私有的第三个方法。作为开发者,你可以选择不把这个第三个方法放到公共接口里,但它依然存在于你的源代码中:
class FooAPI(object):
def publicMethodOne(*args, **kw):
return self._privateMethod(1, *args, **kw) + 7
def publicMethodTwo(*args, **kw):
return self._privateMethod(2, *args, **kw) + 11
def _privateMethod(somevalue, *args, **kw):
return somevalue * 3
在这种情况下,使用你这个API的用户完全不需要直接调用 _privateMethod
,也不需要把它的返回值传给 publicMethod
。
不过,如果你觉得使用你这个API的人需要给你的方法提供一些特定的信息,而这个信息在大多数情况下可以通过一个简单的默认方法来计算出来,那你就应该把这个默认方法的返回值传进去。这样,使用者也可以用他们自己的计算方法,使用那些值 来替代:
def publicMethod(value1, value2):
return value1 / value2
def mostCommonValues():
return (1.0, 4.0)
publicMethod(*mostCommonValues())
publicMethod(4, 2)
那么,什么时候使用实例变量呢?只有当一个函数的返回值需要和实例一起保存时,也就是当它们反映了这个实例的内部状态。
举个例子,如果你的类代表一辆车,那么在对这辆车进行操作时,存储它的位置可能对你的应用程序来说是有意义的。所以如果你想知道它现在是否需要在红绿灯前停下,首先调用 updatePosition()
方法,然后再用另一个方法计算与红绿灯的距离。你不会把 updatePosition()
的输出传给距离计算的方法,而是直接在实例中保持位置的更新。
但是,如果你需要在碰撞中更新车的位置,你就需要从车那里获取数据(根据在车上调用的方法的返回值),再结合外部信息(比如其他物体的位置、路面的阻力等),把这些信息反馈到车的 updatePosition
方法中。因为你现在需要从 车的实例外部 添加额外的信息,所以你必须通过公共API把一个方法调用的值传递给另一个方法。
记住,软件开发更像是一种艺术,而不是严格的工程学科,因此如何做这个问题的答案因开发者和软件项目而异。没有一个固定的答案。尽量让它明确、显而易见,自然就好。
正如import this
中所说的,“明确比隐含要好”;所以建议使用第一种形式。
如果返回的值变得很多,可以让use_value
接收一个序列作为参数。