python - 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)
没问题。
解决方案
因此,您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
推荐阅读
- excel - 需要带有临时变量的公式
- python - 在 pandas 中,如何在单个单元格中设置数字格式?
- mysql - 将三个表与两个动态值组合在一起
- relational-database - 是否可以使用关系演算来表达非空约束?
- php - 读取 XML 时嵌套 foreach(在 PHP 中)
- php - 贝宝不支持的货币和费用php
- javascript - 如何让鼠标悬停在我想要的范围内工作?
- vhdl - 使用 modelsim 在 vhdl 中注册设计
- visual-studio-code - 如何在 vscode 中更改“命令调色板边框”颜色
- jquery - return 语句警告后如何解决无法访问的代码?