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

2024-04-26 10:41:09 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我有课。。。

class MyClass:

    def method(arg):
        print(arg)

。。。我用它来创建一个对象。。。

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告诉我我给了它两个参数,而我只给了一个?


Tags: 对象mostobjectfoomydefmyclassarg
3条回答

当您不指定__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__() takes 1 positional argument but 6 were given

我们怎样才能摆脱这件事?

只需传递参数,什么__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))

在Python中,这个:

my_object.method("foo")

。。。是syntactic sugar,解释器在幕后将其翻译为:

MyClass.method(my_object, "foo")

。。。正如你所看到的,它确实有两个参数——从调用者的角度来看,第一个参数是隐式的。

这是因为大多数方法对它们被调用的对象做一些工作,所以需要有某种方法才能在方法内部引用该对象。按照惯例,第一个参数在方法定义中称为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

有时(但不是经常),您真的不关心方法绑定到的对象,在这种情况下,您可以使用内置函数decorate方法这样说:

class MyOtherClass:

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

。。。在这种情况下,您不需要向方法定义添加self参数,它仍然可以工作:

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

遇到此类错误时需要考虑的其他事项:

我遇到这个错误信息,发现这篇文章很有帮助。在我的例子中,我重写了一个存在对象继承的init。

继承的示例相当长,因此我将跳到一个不使用继承的更简单的示例:

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没有注意到这个错误。Notepad++也没有(其他编辑器/IDE也有可能)。

当然,这是一个“不接受任何参数”的TypeError,就Python中的对象初始化而言,它与期望值为1时的“got two”没有太大区别。

解决这个问题:如果语法正确,将使用重载初始值设定项,但如果不正确,则将忽略该初始值设定项,而使用内置的初始值设定项。对象将不期望/处理此操作,并引发错误。

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

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

相关问题 更多 >