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)
…在这种情况下,您不需要为方法定义添加self
variables,它仍然可以工作:
>>> 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))