一个函数是一个可以被调用的对象,因此定义一个带有 __call__
方法的类,在原则上等同于定义一个函数。 至少在你所给出的上下文中是这样。
因此:
def user_func(x, y, z):
return anything_with(x, y, z)
等价于:
class user_class(object):
@staticmethod
def __call__(x, y, z):
return anything_with(x, y, z)
目前这只是混淆代码,但当你创建一个具有预定义属性的实例,并且只将变量参数指定为call
的参数时,魔法就会发生:
class user_class(object):
def __init__(self, x):
self.x = x
def __call__(self, y, z):
return do_anything_with(self.x, y, z)
但是,您需要改变调用
lib_func
的方式:
x = 0
user_class_instance = user_class(0)
result = lib_func(user_class_instance, param1)
这样它将会重复调用实例,并使用不同的 y
和 z
,但是 x
将保持不变。
大多数这种 lib_func
函数允许传递可变参数(这些参数将被传递给 user_func
),例如scipy.optimize.curve_fit
:
curve_fit(user_func, x, y, [initial_guess_param1, param2, ...])
在这里,curve_fit
内部将会调用user_func
(您无需做任何事情!),示例如下:
user_func(x, initial_guess_param1, param2, ...)
user_func(x, initial_guess_param1, param2, ...)
user_func(x, initial_guess_param1, param2, ...)
在调用curve_fit
时,x
和y
被定义并且不会改变,但是在寻找最佳的curve_fit
时,initial_guess_param1
将会被更改。