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

时间:2016-11-22 12:45:46

标签: 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):
    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不喜欢self.args_a的参数中的self.args_b__call__,我理解为什么。 有人知道一个聪明的方法来获得这个吗?非常感谢您提前

1 个答案:

答案 0 :(得分:0)

如果你只是接受位置参数,最好保存每个函数的参数长度,然后在调用方法中为每个函数传递适当的SELECT convert(datetime, '8/17/2016', 111) 切片:

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)