如果我有课…
class MyClass: def method(arg): print(arg)
…我用来创建一个对象…
my_object = MyClass()
…我method("foo")这样称呼…
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 告诉我我给了它两个参数,而我只给了一个参数?
在 Python 中,这是:
my_object.method("foo")
…是语法糖,解释器在幕后将其翻译成:
MyClass.method(my_object, "foo")
…正如您所见,它确实有两个参数 - 从调用者的角度来看,只是第一个参数是隐含的。
这是因为大多数方法对它们被调用的对象做一些工作,所以需要有某种方法可以在方法内部引用该对象。按照惯例,第一个参数self在方法定义中被调用:
self
class MyNewClass: def method(self, arg): print(self) print(arg)
如果您调用method("foo")的实例MyNewClass,它将按预期工作:
MyNewClass
>>> my_new_object = MyNewClass() >>> my_new_object.method("foo") <__main__.MyNewClass object at 0x29045d0> foo
偶尔(但不经常),你真的 不 关心你的方法绑定到的对象,在这种情况下,你可以用内置函数来装饰方法,这样说:staticmethod()
staticmethod()
class MyOtherClass: @staticmethod def method(arg): print(arg)
…在这种情况下,您不需要向self方法定义添加参数,它仍然有效:
>>> my_other_object = MyOtherClass() >>> my_other_object.method("foo") foo