TypeError: object() takes no parameters

平常编写Python代码的过程当中,特别是Python新手,常常会遇到这样的错误:html

TypeError: object() takes no parameters复制代码

对于上面这个错误,很容易迷惑咱们,由于这个错误信息没有很明确的指出,究竟是哪段代码除了问题。那这个错误是怎么产生的了,请听我细细道来。python

在python中,方法是一个属性,也就是说,当咱们调用一个方法时,python须要所属方法名对应的属性,好比说:git

o.m()复制代码

python会如今对象o中搜索m属性,若是对象o有m属性(判断对象o有没有m属性,能够用hasattr函数)则调用它。bash

然而,python的方法是定义在一个class里的,而不是object里。也就是说若是m是o的方法,那就不多是它的属性。正常状况下,python会先搜索对象的属性,若是没有,再去搜索类的属性,若是属性存在,则能够调用。(这地方可能你们会被类和对象两个概念搞混,不太准确的来讲,类就是class,对象就是实例,具体你们能够查看文章笨办法学Python)函数

在python中,大多数的类都继承自object,在Python3中,若是你没有指定继承object,解释器会自动给你加上,而Python若是你没有指定,则为old-style class。你们在平时编写类时,建议你们都最好加上继承object,这样一个是代码兼容性号,一个是比较优雅。spa

若是属性在对象里不存在,咱们会获得一个错误信息,指明了哪一个地方的代码有问题和出问题的缘由,可是和咱们上面说的错误code

TypeError: object() takes no parameters复制代码

这个错误是我在建立对象实例时报的错误,例如:htm

class Foo(object):
    pass复制代码

若是我这样:对象

f = Foo()复制代码

就不会有任何问题,可是若是我这样:继承

f = Foo(10)复制代码

而后我就会获得上面的错误,这到底是为何了?

这是由于Python在建立对象是,分为两个阶段:第一个阶段,对象是经过调用new方法来建立的,这个方法的细节咱们基本上不用关心。new方法并不会当即返回一个对象实例,new方法以后,会调用init方法来给对象增长新的属性。对于上面的对象o,调用的就是

o.__init__()复制代码

Python首先查找o的init方法,可是没找到,而后查找父类的init方法,假设父类是上面的Foo,能够方式init方法依然不存在,因此最后会找到object的init属性。object的init是存在的,而且是个方法,而后调用这个方法,传入相应的参数,可是object.init方法没有参数,而后咱们就获得的上面的错误。

TypeError: object() takes no parameters复制代码

整个流程下来,最让人迷惑的地方是,Python没有这样报错:

“object.__init__()” takes no parameters复制代码

因而咱们无法定为这个问题出在哪。

总结下来,在实现一个python的类时,最后写上init方法,这样就能够避免这样的迷惑性的错误。

转载自个人博客捕蛇者说

相关文章
相关标签/搜索