Python认为我传递了4个参数,但我显然只传递了3个

时间:2014-01-12 02:08:35

标签: python arguments

错误是:

TypeError:  kernel() takes exactly 3 arguments (4 given)

相应的代码是:

K[i][j] = self.kernel(self, B[i], C[j])
...
def kernel(self, P, Q)

以下几行的结果是:

print self:  object at 0x....
print len((self, B[i], C[j])): 3
print len((B[i])): 4
print len((C[j])): 4

为什么会说4个参数,我该如何解决呢?

3 个答案:

答案 0 :(得分:5)

绑定方法会自动隐式添加self 。不要明确地传递它:

K[i][j] = self.kernel(self, B[i], C[j])

删除self

K[i][j] = self.kernel(B[i], C[j])

否则使用kernel()或4个参数调用kernel(self, self, B[i], C[j])

答案 1 :(得分:4)

请注意

obj_name.kernel(B[i], C[j])

将完成同样的工作

class_name.kernel(obj_name, B[i], C[j]),其中obj_nameclass_name类的实例。

所以你需要把它称为:

K[i][j] = self.kernel(B[i], C[j])

示例:

class C:
    def f(self, a):
        print "HI: " + str(a)

var = C()
var.f(1)
C.f(var, 1)

<强>输出:

HI: 1
HI: 1

答案 2 :(得分:3)

因为在Python中,self被隐式地作为参数传递给类的任何成员函数。所以你真正要做的就是传递两个self

只需删除self即可解决问题。

K[i][j] = self.kernel(B[i], C[j])