首页 > 解决方案 > TypeError:“类名”对象不可调用

问题描述

我正在研究一个使用“x,y”数据集的类。数据通常来自 txt 文件,其中第一列数据存储在“x”中,第二列存储在“y”中。

我在课堂上添加了一些“曲线拟合”功能。我在这篇文章的标题中得到了错误。

这是课程:

class XY(object):
    import matplotlib.pyplot as plt
    from scipy.optimize import curve_fit
    import numpy as np
    def __init__(self,f=None):
        self.file(f)
        self.read()
        return
    def file(self,f=None):
        self.filename=self.get_filename(f)
        return
    def filename(self):
        return self.filename
    def get_filename(self,f):
        if(type(f)==str):
            filename=f
        elif(type(f)==file):
            filename=f.name
        else:
            filename=None
        return filename
    def read(self,f=None):
        if(f is None):
            if(self.filename is None):
                return
            else:   # Use internal filename
                filename=self.filename
        else:   # Change/set internal filename
            self.filename=self.get_filename(f)
            filename=self.filename
        data=[]
        try:
            with open(filename,'r') as F:
                for line in F:
                    data.append(line.split())
        except IOError as e:
            print("%s"%e)
            return
        F.close()
        for r in range(0,len(data)):
            for c in range(0,len(data[r])):
                data[r][c]=float(data[r][c])
        self.data=data
        self.x=[self.data[i][0] for i in range(0,len(self.data))]
        self.y=[self.data[i][1] for i in range(0,len(self.data))]
        return self.data
    def f00(self,x,a,b,c,d):
        return a*x**b*self.np.exp(-c*x)+d
    def cf00(self):
        popt,pcov=self.curve_fit(self.f00,self.x,self.y)
        self.y=self.f00(self.x,*popt)
        return self.y

我以交互模式将类粘贴到 python 中。然后尝试以下操作:

$ python
Python 2.7.14 (default, Oct 31 2017, 21:12:13)
[GCC 6.4.0] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>>

我粘贴在上面显示的类中,然后尝试以下操作:

>>> xy=XY("rot-03-05.dat")
>>> len(xy.x)
220
>>> len(xy.y)
220
>>> xy.cf00()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 56, in cf00
  File "/usr/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 751, in curve_fit
    res = leastsq(func, p0, Dfun=jac, full_output=1, **kwargs)
  File "/usr/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 383, in leastsq
    shape, dtype = _check_func('leastsq', 'func', func, x0, args, n)
  File "/usr/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 27, in _check_func
    res = atleast_1d(thefunc(*((x0[:numinputs],) + args)))
  File "/usr/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 463, in func_wrapped
    return func(xdata, *params) - ydata
TypeError: 'XY' object is not callable
>>> xy.cf00
<bound method XY.cf00 of <__main__.XY object at 0x6ff5ea25fd0>>

我试着self取出f00()and cf00()。没用。

我尝试f00()从我的实例调用,它的工作原理:

>>> xy=XY()
>>> xy.f00(1,1,1,1,1)
1.3678794411714423

我在其他地方使用了这个曲线拟合功能,它可以工作。现在,我正在尝试在一个类中实现它。

以下是在它们不属于类时可以工作的独立函数:

def f00(x,a,b,c,d): return a*x**b*np.exp(-c*x)+d
def cf00(x,y):
    popt,pcov=curve_fit(f00,x,y,maxfev=1200000)
    return f00(x,*popt)

y1=cf00(x,y)

没问题。

标签: pythonpython-2.7scipy

解决方案


因此,您from scipy.optimize import curve_fit在类定义中导入,python 将该名称绑定到类命名空间,因此当您调用self.curve_fit它时,它可以工作,但请记住,curve_fit函数是在scipy.

当您调用时self.method(),真正发生的是: type(self).method(self),因此当您调用self.curve_fit它时,它会将类XY作为第一个参数传递,并且它需要一个函数。

为了解决这个问题,我建议将导入放在文件的最顶部,然后在curve_fit没有self


推荐阅读