类型错误:方法()采用 1 个位置参数,但给出了 2 个

新手上路,请多包涵

如果我有课…

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

原文由 Zero Piraeus 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 636
2 个回答

在 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

原文由 Zero Piraeus 发布,翻译遵循 CC BY-SA 4.0 许可协议

简单来说

在 Python 中,您应该添加 self 作为类中所有已定义方法的第一个参数:

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

然后你可以根据你的直觉使用你的方法:

 >>> my_object = MyClass()
>>> my_object.method("foo")
foo

为了更好地理解,您还可以阅读这个问题的答案: self 的目的是什么?

原文由 simhumileco 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题