在面向对象的python

时间:2019-06-28 11:24:44

标签: python

我刚刚开始学习面向对象的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

因此,这里显然有一个额外的论点。为什么在字符串大小写中不出现相同的幻影参数?

1 个答案:

答案 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()都可以使用。