Python: add和__add__的区别

8
在Python中,add__add__方法有什么区别?

截至撰写本问题时,我找不到重复项。 - Dharmit
你指的是哪个“add”方法? - m0sa
2
谷歌搜索没有帮助我,所以我在这里发布了问题。而且SO上还有更傻的问题。你是专家并不意味着每个人都是专家。有时候谷歌上的关键词不能得到想要的结果,那么我就来到SO,因为我知道像你这样的人存在,会热情地回答像我这样有(愚蠢)疑问的人。 - Dharmit
1
@joaquim,没有理由因为其他地方已经有关于问题的信息就对问题进行负评。你可以选择不回答或者指向其他资源——问题本身并没有变得不合法。 - jsbueno
如果它是其他地方可用的信息的复制品,请不要假定该信息将永远在互联网上其他地方可用,或者该信息以合理、同行评审和可编辑的形式存在...我们一直鼓励将信息复制到Stack Overflow中,即使它已经存在于其他地方。-- Joel Spolsky http://meta.stackexchange.com/questions/134645/is-stack-overflow-a-central-store-for-tutorials - JS.
显示剩余2条评论
3个回答

14
一个叫做add的方法,就是一个名字为此的方法。它对于语言或解释器来说没有任何特殊意义。唯一可以说的是集合有一个同名的方法。仅此而已,没有什么特别的。
方法__add__+操作符在内部调用,所以它在语言规范和解释器中得到了特殊关注,并且您可以重写它来定义类对象的加法运算。您不会直接调用它(虽然您可以——它们仍然是普通方法,只是在某些情况下隐式调用并具有一些额外的限制——但很少有理由——更不用说一个好的理由了)。有关详细信息和其他“特殊”方法的完整列表,请参阅“特殊”方法的文档

1
感谢您的简单解释。 - Dharmit

1
如果您刚刚阅读了这篇文档https://docs.python.org/3/library/operator.html,并且对例如“+”和“add”之间的区别感到好奇,请继续阅读。
operator.add(a, b)
operator.__add__(a, b)

请查看源代码:https://github.com/python/cpython/blob/3.10/Lib/operator.py

def add(a, b):
    "Same as a + b."
    return a + b

...
# All of these "__func__ = func" assignments have to happen after importing
# from _operator to make sure they're set to the right function
...
__add__ = add

所以
print(3+3) # call `operator.__add__` which is `operator.add`
import operator
print(operator.add(3, 3)) # call `operator.add` directory


0

补充之前的帖子,除非在核心Python功能上进行一些黑客攻击,例如修改/重载标准运算符等,否则通常不建议将__*__用作自有类中标识符的名称。而且,通常这样的名称与神奇行为相关联,因此在自己的命名空间中避免使用它们可能是明智的选择,除非方法的神奇性质被暗示。

请参见this post以获取详细论述


实际上,在你的类中创建自己的 __*__ 方法并不那么神秘,这是相当简单的 - 没有必要让它听起来那么玄妙。 - jsbueno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接