我有两个功能:
我不能改变的库函数说,lib_func( func, param1)
即lib_func
以一个函数func
和一些其他参数param1
作为参数。
用户定义的功能user_func
。
例如:
x = 0
y = 0
def user_func():
global x
global y
return sqrt(x*y)
现在的问题是我想在传递给时将xuser_func
作为参数而不是全局变量传递user_func
给lib_func
。
函数只是一个可以调用的对象,因此,使用__call__
方法定义类在原则上等同于定义函数。至少在您给出的情况下。
所以:
def user_func(x, y, z):
return anything_with(x, y, z)
等效于:
class user_class(object):
@staticmethod # staticmethod so that it can be called on the class
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): # No x as parameter!
return do_anything_with(self.x, y, z) # use the predefined x here
但您需要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, ...])
那里user_func
将被称为curve_fit
内部(你没有做任何事情!),如:
user_func(x, initial_guess_param1, param2, ...)
# Then curve-fit modifies initial_guess_param1, param2, ... and calls it again
user_func(x, initial_guess_param1, param2, ...)
# and again modifies these and calls again
user_func(x, initial_guess_param1, param2, ...)
# ... until it finds a solution
有x
和y
定义和调用时没有改变curve_fit
,但initial_guess_param1
同时寻求最优将被改变curve_fit
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句