问题描述
如果我有一堂课...
class MyClass:定义方法(arg):打印(参数)
...我用来创建一个对象...
my_object = MyClass()
...我像这样调用 method("foo")
...
...为什么 Python 告诉我我给了它两个参数,而我只给了一个参数?
在 Python 中:
my_object.method("foo")
...是语法糖,解释器在幕后将其翻译为:>
MyClass.method(my_object, "foo")
...正如你所看到的,它确实有两个参数——只是第一个参数是隐式的,从调用者的角度来看.
这是因为大多数方法都会对调用它们的对象进行一些工作,因此需要有某种方式在方法内部引用该对象.按照惯例,第一个参数在方法定义中称为 self
:
class MyNewClass:定义方法(自我,arg):打印(自己)打印(参数)
如果您在 MyNewClass
的实例上调用 method("foo")
,它会按预期工作:
偶尔(但不经常),您真的不关心您的方法绑定到的对象,在这种情况下,您可以decorate 使用内置的方法 staticmethod()
函数这么说:
class MyOtherClass:@静态方法定义方法(arg):打印(参数)
...在这种情况下,您不需要在方法定义中添加 self
参数,它仍然有效:
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 个的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!