TypeError:method()需要1个位置参数,但给出了2个

如果我有class…

class MyClass: def method(arg): print(arg) 

…我用它来创build一个对象

 my_object = MyClass() 

…我就像这样称之为method("foo")

 >>> my_object.method("foo") Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: method() takes exactly 1 positional argument (2 given) 

…为什么Python告诉我,我给了它两个论点,当我只给了一个?

在Python中,这个:

 my_object.method("foo") 

…是句法糖 ,口译员在幕后翻译成:

 MyClass.method(my_object, "foo") 

……如你所见,它确实有两个论点 – 从调用者的angular度来看,第一个是隐含的。

这是因为大多数方法都会在被调用的对象上做一些工作,所以需要在方法内部引用该对象。 按照惯例,这个第一个参数在方法定义中被称为self

 class MyNewClass: def method(self, arg): print(self) print(arg) 

如果您在MyNewClass一个实例上调用method("foo") ,它将按预期工作:

 >>> my_new_object = MyNewClass() >>> my_new_object.method("foo") <__main__.MyNewClass object at 0x29045d0> foo 

偶尔(但不是经常),你真的关心你的方法绑定的对象,在这种情况下,你可以用内置的staticmethod()函数来装饰方法来说明:

 class MyOtherClass: @staticmethod def method(arg): print(arg) 

…在这种情况下,您不需要为方法定义添加selfvariables,它仍然可以工作:

 >>> my_other_object = MyOtherClass() >>> my_other_object.method("foo") foo 

遇到这种types的错误时需要考虑的其他事项:

我遇到了这个错误信息,发现这个post很有帮助。 原来在我的情况下,我已经覆盖了一个init ()哪里有对象inheritance。

inheritance的例子是相当长的,所以我会跳到一个更简单的例子,不使用inheritance:

 class MyBadInitClass: def ___init__(self, name): self.name = name def name_foo(self, arg): print(self) print(arg) print("My name is", self.name) class MyNewClass: def new_foo(self, arg): print(self) print(arg) my_new_object = MyNewClass() my_new_object.new_foo("NewFoo") my_bad_init_object = MyBadInitClass(name="Test Name") my_bad_init_object.name_foo("name foo") 

结果是:

 <__main__.MyNewClass object at 0x033C48D0> NewFoo Traceback (most recent call last): File "C:/Users/Orange/PycharmProjects/Chapter9/bad_init_example.py", line 41, in <module> my_bad_init_object = MyBadInitClass(name="Test Name") TypeError: object() takes no parameters 

PyCharm没有收到这个错字。 记事本+ +(其他编辑/ IDE的可能)也没有。

当然,这是一个“不带参数”的TypeError,与Python中的对象初始化方面相比,它在期待之一时与“得到两个”没有多大区别。

处理主题:如果语法正确,将使用重载初始化程序,但如果不是,则会被忽略,而使用内置的。 该对象不会期望/处理这个和错误抛出。

在sytax错误的情况下:修复很简单,只需编辑自定义的init语句:

 def __init__(self, name): self.name = name 

当你没有指定init ()或其他方法寻找的参数号时,就会发生这种情况

例如

 class Dog: def __init__(self): print("IN INIT METHOD") def __unicode__(self,): print("IN UNICODE METHOD") def __str__(self): print("IN STR METHOD") obj=Dog("JIMMY",1,2,3,"WOOF") 

当你运行上面的程序时,它会给你一个像TypeError一样的错误:__init __()需要1个位置参数,但是有6个是给定的

我们怎么能摆脱这个东西?

只需传递参数, init ()方法寻找什么

 class Dog: def __init__(self, dogname, dob_d, dob_m, dob_y, dogSpeakText): self.name_of_dog = dogname self.date_of_birth = dob_d self.month_of_birth = dob_m self.year_of_birth = dob_y self.sound_it_make = dogSpeakText def __unicode__(self, ): print("IN UNICODE METHOD") def __str__(self): print("IN STR METHOD") obj = Dog("JIMMY", 1, 2, 3, "WOOF") print(id(obj)) 
Interesting Posts