2016-07-19 6 views
-1

私はかなりPythonを初めて使い慣れました。ここでは、ブロブのような構造を表現するクラスを作成しています。しかし、私のコードは次のエラー得られます基本的なPythonクラスは、TypeErrorを返します。

TypeError: add() takes 3 positional arguments but 4 were given

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)"行から発生します。

+6

あなたのメソッドは、最初のパラメータとしてselfを受け入れる必要があります。つまり、def add(self、x、y、newCorrel): – AK47

+0

[自己の目的はPythonでどういうのですか?](http://stackoverflow.com/questions/2709821/what-of-the-self-in-python) –

+0

チュートリアルの[クラス]セクション(https://docs.python.org/3/tutorial /classes.html#classes) - あなたはそれを何度も繰り返さなければならないかもしれません:9.1)名前とオブジェクトと9.2)スコープと名前空間のサブセクションは、理解するために非常に重要です。アトリビュートが*インスタンス*アトリビュートであることを意図している場合、 '' 'self''は通常インスタンスの名前として使われ、常にインスタンスメソッドに渡される最初の引数です。 – wwii

答えて

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__とする。他の方法にも同じことが言えます。

+0

さらに、メソッドは、クラスBlobではなく、インスタンスselfを参照する必要があります。 '__init __(self)'の最初の行は次のようになります: 'self.mass = 0' – Aaron

+1

@Aaronはい、その上で作業していました –

+0

です。皆さん、ありがとうございました! –

1

の場合、関数の最初の引数はselfです。あなたのメインでは、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) 
+1

'self'はちょうど大会btwですが、これは良いことです!それを保ちましょう – pwnsauce

0

Pythonクラスのメソッドの最初の引数はself即ちdef add(self, x, y, newCorrel):代わりにdef add(x, y, newCorrel):する必要があります。

selfは暗黙的にクラスインスタンスメソッドに渡されます。したがって、明示的に渡す3つの引数の代わりに4つの引数が渡されます。

N.B.非インスタンスメソッド(静的メソッド)では、最初のパラメータとしてselfは必要ありません。詳細はhereを参照してください。

関連する問題