我刚刚开始学习面向对象的python,在我学习的过程中,要做的第一件事就是了解该代码给出的错误。
class NewList():
def first_method():
print("hello")
instance = NewList()
instance.first_method()
这是错误。
---------------------------------------------------------------------
TypeError Traceback (most recent call last)
ipython-input-44-9e10ffed0a3f in module()
----> 1 instance.first_method()
TypeError: first_method() takes 0 positional arguments but 1 was given
我的理解是,当您调用属于特定对象的方法时,python实际上会这样做:
instance.first_method(instance)
但是由于我们没有给我们的方法任何位置参数,所以会出现错误。
我尝试使用其他类对此进行试验。我参加了字符串课,并尝试了同样的事情。
instance_2=str()
result=instance_2.title()
print(result)
这里没有错误。我的理由是,在定义title方法时,在某处源代码中(我试图查找并发现自己,但我无法理解),它被赋予了“ self”参数。也就是说,在我的脑海中,我认为打印结果代码是这样做的:
print(instance_2.title(instance_2))
因此该方法需要1个参数,并且给出了一个。我决定通过有目的地添加一个额外的参数来查看title()方法实际使用了多少个参数,以查看错误消息。
instance_2=str()
result=instance_2.title(instance_2)
print(result)
在这里,我发现我给出了2个位置参数,但是title()只需要1个。
相反,我明白了。
TypeErrorTraceback (most recent call last)
<ipython-input-1-a25ae25c09cc> in <module>()
1 instance_2=str()
----> 2 result=instance_2.title(instance_2)
3 print(result)
TypeError: title() takes no arguments (1 given)
我担心的是为什么它说在第一种情况下我只给出1个参数,而我却没有,而我仍然给出了1个参数,所以我假设1总是默认给出。显然不是这样。 我什至尝试在我的第一个代码中做同样的事情(添加一个额外的参数):
class NewList(DQ):
def first_method():
print("hello")
instance=NewList()
instance.first_method(instance)
这是错误(开始时跳过了绒毛)
TypeError: first_method() takes 0 positional arguments but 2 were given
因此,这里显然有一个额外的论点。为什么在字符串大小写中不出现相同的幻影参数?
答案 0 :(得分:0)
title
的实现类似于staticmethod
描述符,因此它可以在str
类及其任何实例上使用。但是,从str
类中调用它时,它需要一个附加参数-要操作的字符串。
在您的情况下,您已将first_method
设为未绑定函数,只能将其称为类属性。不能从实例调用它,因为一旦执行instance.first_method()
,Python就会在运行时将实例(通常为self
)作为第一个参数隐式传递,但是该函数因此不接受任何参数错误。
如果要使其同时适用于类和实例,则可以使用staticmethod
描述符将其设置为静态方法:
class NewList():
@staticmethod
def first_method(cls):
print("hello")
现在NewList.first_method()
和NewList().first_method()
都可以使用。