类的 self 变量作为类方法 (python) 的参数



这是我的问题:

给定任意两个函数,例如 f(x,a) 和 g(x,b),我想构建一个新函数,比如 F(f,g),它返回 f 和 g 的乘积。所以:

F(f,g) = f*g = f(x, a) * g(x, b)= F(x, a, b)

我想尽可能少地进行硬编码。所以,对于 h(x, c, d),我会得到 F(f,h) = F(x, a, c, d)。 鉴于我想最小化 F,我想建立一个类。这是MWE:

import numpy as np
from inspect import getargspec
def f(x, a):
return np.tanh(x*a)
def g(x, b):
return np.power(x,b)
def h(x, c, d):
return x*c+np.log(x)
class fit_func(object):
def __init__(self, data, *args):
self.data = data
self.func_a = args[0]
self.func_b = args[1]
self.args_a = getargspec(args[0])[0][1:]
self.args_b = getargspec(args[1])[0][1:]

在这一点上,我想包括以下__call__方法:

def __call__(self, *self.args_a, *self.args_b):
return self.func_a(self.data,self.args_a)*self.func_b(data,self.args_b)

我想:这样,类的一个实例,比如F = fit_func(some_data_array,f,g),就可以被调用为F(a,b)。但是,python不喜欢__call__论点中的self.args_aself.args_b,我理解为什么。 有谁知道获得这个的聪明方法吗?提前非常感谢

如果你只接受位置参数,你最好保存每个函数的参数长度,然后在调用方法中为每个函数提供适当的args切片:

import numpy as np
from inspect import getargspec
class fit_func(object):
def __init__(self, *args):
self.func_a = args[0]
self.func_b = args[1]
self.size_arg_a = len(getargspec(self.func_a)[0])
self.size_arg_b = len(getargspec(self.func_b)[0])
def __call__(self, *args):
return self.func_a(*args[:self.size_arg_a]) * self.func_b(*args[self.size_arg_b-1:])

演示:

def f(x, a):
return np.tanh(x*a)
def h(x, c, d):
return x*c+np.log(x)
F = fit_func(f, h)
print(F(3, 4, 3, 5, 7))
16.0986122875

如果要将关键字参数传递给最终函数:

import numpy as np
from inspect import getargspec
from operator import itemgetter

class fit_func(object):
def __init__(self, *args):
self.func_a = args[0]
self.func_b = args[1]
self.arg_a = getargspec(self.func_a)[0]
self.arg_b = getargspec(self.func_b)[0]
def __call__(self, **kwargs):
arg_a = itemgetter(*self.arg_a)(kwargs)
arg_b = itemgetter(*self.arg_b)(kwargs)
return self.func_a(*arg_a) * self.func_b(*arg_b)

演示:

def f(x, a):
return np.tanh(x*a)
def h(x, c, d):
return x*c+np.log(x)
F = fit_func(f, h)
print(F(x=3, a=4, c=5, d=7))
16.0986122875

最新更新