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

发布于 2021-02-02 23:17:17

如果我有课…

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告诉我给它两个参数?

关注者
0
被浏览
112
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    在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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看