我对Python很新。在这里,我正在创建一个类来表示类似blob的结构。但是,我的代码产生以下错误:
TypeError:add()需要3个位置参数,但是给出了4个
class Blob:
mass = 0
xvals = []
yvals = []
correlationVal = 0
def __init__(self):
Blob.mass = 0
Blob.correlationVal = 0
def add(x, y, newCorrel):
Blob.correlationVal = computeCorrelation(newCorrel)
Blob.mass += 1
Blob.xvals.append(x)
Blob.yvals.append(y)
def computeCorrelation(newCorrel):
prevCorrel = Blob.correlationVal*Blob.mass
updatedCorrel = (prevCorrel + newCorrel)/(Blob.mass + 1)
return updatedCorrel
if __name__ == "__main__":
test1 = Blob()
print(test1.mass)
test1.add(0, 0, 12)
print(test1.mass)
print(test1.correlationVal)
test1.add(0, 1, 10)
print(test1.mass)
print(test1.correlationVal)
test1.add(1, 1, 11)
print(test1.mass)
print(test1.correlationVal)
print(test1.xvals)
print(test1.yvals)
我在这里做错了什么,当我供应3时,我如何给出4个输入?
注意:错误来自“test1.add(0,0,12)”行。
答案 0 :(得分:4)
您的实例方法缺少self
引用:
def computeCorrelation(self, newCorrel)
# ^
def add(self, x, y, newCorrel)
# ^
实例方法传递的第一个参数是对该类实例的引用。所以你的add
方法应该接受4个参数,但是当从类的实例调用方法时,你只需要传递3。 Python会为您传递对该实例的引用。
更重要的是,您将类中的属性引用为Blob.some_attribute
,您应该使用self
:
def __init__(self):
self.mass = 0
self.correlationVal = 0
仅在类的实例__init__
上修改这些属性。这同样适用于其他方法。
答案 1 :(得分:1)
在一个类中,函数的第一个参数是self
。在你的主要时,你打电话给test1.add(0, 0, 12)
,打电话给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)
答案 2 :(得分:0)
Python类方法的第一个参数需要是self
,即def add(self, x, y, newCorrel):
而不是def add(x, y, newCorrel):
。
Self在被调用时被隐式传递给类实例方法,因此传递了4个参数而不仅仅是你明确传递的3个参数。
N.B。非实例方法(静态方法)不需要self作为其第一个参数。有关详细信息,请参阅here。