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

类的自变量作为类方法的参数(python),python,class,arguments,Python,Class,Arguments,我的问题是: 给定任意两个函数,例如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): retu

我的问题是:

给定任意两个函数,例如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:]
在这一点上,我考虑包括以下
\uuuuuu调用
方法:

    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\u func(一些数据数组,F,g)
,可以调用为
F(a,b)
。但是,python不喜欢
\u调用
的参数中的
self.args\u a
self.args\u b
,我理解原因。
有人知道一个聪明的方法来获得这个吗?非常感谢您

如果您只接受位置参数,您最好保存每个函数的参数长度,然后将
参数的适当片段
传递给调用方法中的每个函数:

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:])
演示:

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

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)
演示:


我相信你的意思是f(x,a)*g(x,b)=f(x,a,b)当然,Mike和我也纠正了一件事:
\u调用
方法的参数中,
self.args\u a
b
前面的解包*,如果我不想要位置参数,而是用与函数定义相对应的kwdargs调用
\u调用
方法,那该怎么办,
g
h
?所以
F(F,h)=F(a=…,c=…,d=…)
。在更新版本中,用户需要知道
f
h
的参数名称。换句话说:有没有办法从
F(F,h)
中获得
getargspec(F)[0]=['x',a',c',d']
?@andrea为什么不呢,只要做
F.arg_a
。我需要一个新函数,其签名由
F
实例化中提供的函数的额外参数给出(例如
a,b
)将传递给iminuit。我无法将其定义为
defnew\u func(F.arg\u a,F.arg\u b):…
。我想答案可能是[但我不确定]
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