本文介绍了类型错误:method() 需要 1 个位置参数,但给出了 2 个的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果我有一堂课...

class MyClass:定义方法(arg):打印(参数)

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

my_object = MyClass()

...我像这样调用 method("foo")...

>>>my_object.method("foo")回溯(最近一次调用最后一次):文件<stdin>",第 1 行,在 <module> 中类型错误:method() 正好需要 1 个位置参数(给定 2 个)

...为什么 Python 告诉我我给了它两个参数,而我只给了一个参数?

解决方案

在 Python 中:

my_object.method("foo")

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

MyClass.method(my_object, "foo")

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

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

class MyNewClass:定义方法(自我,arg):打印(自己)打印(参数)

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

>>>my_new_object = MyNewClass()>>>my_new_object.method("foo")<__main__.MyNewClass 对象在 0x29045d0>富

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

class MyOtherClass:@静态方法定义方法(arg):打印(参数)

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

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

If I have a class...

class MyClass:

    def method(arg):
        print(arg)

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

my_object = MyClass()

...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)

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

解决方案

In Python, this:

my_object.method("foo")

...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.

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)

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

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)

...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

这篇关于类型错误:method() 需要 1 个位置参数,但给出了 2 个的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-20 08:29