2016-11-11 1 views
1

J'ai un funtion défini dans une classeTypeError: objet « liste » est pas appelable en Python dans la programmation mathématique

class someClass: 
    def objFunction(self, weights): 
     return [self.obj1(weights), self.obj2(weights), self.obj3(weights)] 

    def asf(self, f): 

     def obj(x): 
      return np.max(np.array(f(x[0],x[1],x[2])))+0.00001*np.sum(f(x[0],x[1],x[2])) 

     res=minimize(obj, 
     [0.3,0.3,0.4], method='SLSQP' 
     ,jac=ad.gh(obj)[0],options = {'disp':True, 'ftol': 1e-20, 
            'maxiter': 1000}) 
     return res 

où obj1, obj2 et obj3 sont des fonctions objectives optimisées. Je cours cette méthode en faisant un objet séparément:

newObj = SomeClass() 
newObj.objFunction(weights) 

Cela fonctionne bien et donne des résultats attendus. Mais quand j'ai utilisé la même méthode dans une autre méthode de la classe, elle renvoie l'erreur mentionnée ci-dessus. Voici comment je fais:

a = someClass() 
a.asf(a.objFunction(weights) 

Il jette ceci:

Traceback (most recent call last): 
    File "D:/*******.py", line 332, in <module> 
    print(investment.asf(obj1(w),ref,ideal,nadir, rho)) 
    File "*******.py", line 313, in asf 
    ,options = {'disp':True, 'ftol': 1e-20, 'maxiter': 1000}) 
    File "C:\Users\*****\Downloads\WinPython-64bit-3.5.1.2\python-3.5.1.amd64\lib\site-packages\scipy\optimize\_minimize.py", line 455, in minimize 
    constraints, callback=callback, **options) 
    File "C:\Users\*****\Downloads\WinPython-64bit-3.5.1.2\python-3.5.1.amd64\lib\site-packages\scipy\optimize\slsqp.py", line 363, in _minimize_slsqp 
    fx = func(x) 
    File "C:\Users\*******\Downloads\WinPython-64bit-3.5.1.2\python-3.5.1.amd64\lib\site-packages\scipy\optimize\optimize.py", line 289, in function_wrapper 
    return function(*(wrapper_args + args)) 
    File "D:********.py", line 305, in obj 
    return np.max(np.array(f(x[0], x[1], x[2], x[3])))+rho*np.sum(f(x[0], x[1], x[2], x[3])) 
TypeError: 'list' object is not callable 

Je pense que je suis en train de POO (programmation orientée objet) erreur de codage parce que je ne suis pas bon. Des suggestions pour cela? Merci

+1

Veuillez mentionner toute la pile-trace. Avec cette erreur, je pourrais seulement dire que vous appelez la liste comme 'list (n)' au lieu de 'list [n]' quelque part dans votre code –

+0

qu'est-ce que 'ad.gh'? – kilojoules

Répondre

1

a.objFunction(weights) renvoie un list, c'est clair à partir de la définition.

a.asf attend un argument appelé f, qui dans la définition utilisée comme obtient:

f(x[0],x[1],x[2]) 

Alors vous donnez a.asf une liste et d'essayer de l'appeler comme une fonction.