基本Python类产生TypeError

时间:2016-07-19 14:41:18

标签: python class

我对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)”行。

3 个答案:

答案 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