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

2022-01-21 00:00:00 python python-3.x self arguments methods

问题描述

如果我有课...

class MyClass:

    def method(arg):
        print(arg)

...我用来创建对象...

...which I use to create an object...

my_object = MyClass()

...我在上面调用 method("foo") 就像这样...

...on which I call method("foo") like so...

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

...why does Python tell me I gave it two arguments, when I only gave one?


解决方案

在 Python 中:

In Python, this:

my_object.method("foo")

...是语法糖,解释器在幕后将其翻译成:p>

...is syntactic sugar, which the interpreter translates behind the scenes into:

MyClass.method(my_object, "foo")

...正如你所见,它确实有两个参数——只是从调用者的角度来看,第一个参数是隐含的.

...which, as you can see, does indeed have two arguments - it's just that the first one is implicit, from the point of view of the caller.

这是因为大多数方法都对它们被调用的对象做一些工作,所以需要有某种方法可以在方法内部引用该对象.按照惯例,第一个参数在方法定义中称为 self:

This is because most methods do some work with the object they're called on, so there needs to be some way for that object to be referred to inside the method. By convention, this first argument is called self inside the method definition:

class MyNewClass:

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

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

If you call method("foo") on an instance of MyNewClass, it works as expected:

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

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

Occasionally (but not often), you really don't care about the object that your method is bound to, and in that circumstance, you can decorate the method with the builtin staticmethod() function to say so:

class MyOtherClass:

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

...在这种情况下,您不需要在方法定义中添加 self 参数,它仍然有效:

...in which case you don't need to add a self argument to the method definition, and it still works:

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

相关文章