2016-11-22 3 views
2

вот моя проблема:self variable класса как аргумент метода класса (python)

для любых двух функций, например. f (x, a) и g (x, b), я хочу построить новую функцию, скажем F (f, g), которая возвращает произведение f и g. Итак:

F (F, G) = е * г = е (х, а) * г (х, Ь) = Р (х, а, б)

Я хочу сделать это жесткого кодирования наименее возможно. Итак, для 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__, и я понимаю, почему. Кто-нибудь знает умный способ получить это? Большое спасибо заранее

+0

Я считаю, что вы в виду е (х, а) * г (х, * Ь *) = F (х, а, б) – Mike

+0

абсолютно Майк и я также исправлен один вещь: распаковка * перед 'self.args_a' и' b' в аргументе метода '__call__' – andrea

ответ

0

Если вы просто принять позиционные аргументы, которые вы лучше сохранить длину аргументов для каждой функции, а затем па соответствующих кусочков 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:]) 

Demo :

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) 

Demo:

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 
+0

Что делать, если я не хочу позиционных аргументов, а вместо этого вызывать метод' __call__' с kwdargs, соответствующий определение функций 'f',' g' и 'h'? поэтому 'F (f, h) = F (a = ..., c = ..., d = ...)' – andrea

+0

@andrea Оформить обновление. – Kasramvd

+0

это почти это. в вашей обновленной версии пользователь должен знать, что такое имена аргументов 'f' и' h'. в других терминах: есть ли способ получить от F (f, h) 'что' getargspec (F) [0] = ['x', 'a', 'c', 'd'] '? – andrea

Смежные вопросы