Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基本Python类产生TypeError_Python_Class - Fatal编程技术网

基本Python类产生TypeError

基本Python类产生TypeError,python,class,Python,Class,我对Python相当陌生。在这里,我创建了一个类来表示类似blob的结构。但是,我的代码会产生以下错误: TypeError:add()接受3个位置参数,但给出了4个 我在这里做错了什么?当我提供3个输入时,我如何提供4个输入 注意:错误源于“test1.add(0,0,12)”行。您的实例方法缺少self引用: def computeCorrelation(self, newCorrel) # ^ def add(self, x, y, newCo

我对Python相当陌生。在这里,我创建了一个类来表示类似blob的结构。但是,我的代码会产生以下错误:

TypeError:add()接受3个位置参数,但给出了4个

我在这里做错了什么?当我提供3个输入时,我如何提供4个输入


注意:错误源于“test1.add(0,0,12)”行。

您的实例方法缺少
self
引用:

def computeCorrelation(self, newCorrel)
#                       ^

def add(self, x, y, newCorrel)
#        ^
实例方法传递的第一个参数是对该类实例的引用。因此,您的
add
方法应该有4个参数,但是当从类的实例调用该方法时,只需要传递3个参数。Python为您传递对该实例的引用


更重要的是,您将类本身的属性引用为
Blob。对于某些属性
,您应该使用
self

def __init__(self):
    self.mass = 0
    self.correlationVal = 0

这只会修改类实例上的那些属性,而这正是您使用
\uuuu init\uuuu
所希望的。这同样适用于其他方法。

在类中,函数的第一个参数是
self
。在main中,调用
test1.add(0,0,12)
,python调用
test1.add(test1,0,0,12)
,所以现在他有4个参数

class Blob:
    mass = 0
    xvals = []
    yvals = []
    correlationVal = 0

def __init__(self):
    self.mass = 0
    self.correlationVal = 0

def add(self,x, y, newCorrel):
    self.correlationVal = computeCorrelation(self,newCorrel)
    self.mass += 1
    self.xvals.append(x)
    self.yvals.append(y)

Python类方法的第一个参数必须是
self
,即
defadd(self,x,y,newCorrel):
而不是
defadd(x,y,newCorrel):

Self在调用类实例方法时隐式地传递给类实例方法,因此,为什么要传递4个参数,而不仅仅是显式传递的3个参数


注意:非实例方法(静态方法)不要求self作为其第一个参数。有关更多详细信息,请参阅。

您的方法应接受self作为第一个参数。。ie def add(self、x、y、newCorrel):可能的重复项您应该花一些时间阅读-您可能需要多次重新访问它:9.1)名称和对象以及9.2)范围和名称空间小节对于理解非常重要。如果某个属性打算作为实例属性,则
self
通常用于实例的名称,并且它始终是传递给实例方法的第一个参数。此外,这些方法应该引用实例
self
,而不是类
Blob
\uuuu init\uuuu(self)
的第一行将如下所示:
self.mass=0
我明白了。谢谢大家的反馈<代码>自我只是一个惯例,顺便说一句,但这是一个很好的惯例!我们留着吧
class Blob:
    mass = 0
    xvals = []
    yvals = []
    correlationVal = 0

def __init__(self):
    self.mass = 0
    self.correlationVal = 0

def add(self,x, y, newCorrel):
    self.correlationVal = computeCorrelation(self,newCorrel)
    self.mass += 1
    self.xvals.append(x)
    self.yvals.append(y)