gpt4 book ai didi

python - 面向对象Python中关于幻像参数的查询

转载 作者:太空宇宙 更新时间:2023-11-03 20:42:02 24 4
gpt4 key购买 nike

我刚刚开始学习面向对象的Python,在我学习的类(class)中,要做的第一件事就是理解这段代码给出的错误。

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)

但是由于我们没有为我们的方法提供任何位置参数,因此出现错误。

我尝试使用其他类进行实验。我参加了字符串类(class)并尝试了同样的事情。

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

所以这里显然给出了一个额外的论点。为什么在字符串大小写中没有出现相同的幻象参数?

最佳答案

title 的实现类似于 staticmethod 描述符,因此它可以在 str 类及其任何实例上工作。但是当从str类调用它时,它需要一个附加参数——要操作的字符串。

就您而言,您已将 first_method 设为只能作为类属性调用的未绑定(bind)函数。它不能从实例调用,因为一旦执行 instance.first_method() Python 就会在运行时隐式传递实例(通常为 self)作为第一个参数,但该函数不接受任何参数,因此会出现错误。

如果您想让它同时适用于类和实例,您可以使用 staticmethod 描述符将其设为静态方法:

class NewList():
@staticmethod
def first_method(cls):
print("hello")

现在 NewList.first_method()NewList().first_method() 都可以工作。

关于python - 面向对象Python中关于幻像参数的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56806066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com