小编典典

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

all

如果我有课…

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


阅读 109

收藏
2022-03-21

共1个答案

小编典典

在 Python 中,这是:

my_object.method("foo")

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

MyClass.method(my_object, "foo")

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

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

class MyNewClass:

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

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

>>> 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方法定义添加参数,它仍然有效:

>>> my_other_object = MyOtherClass()
>>> my_other_object.method("foo")
foo
2022-03-21