为什么python对某些东西使用两个下划线?

And*_*rew 51 python double-underscore

我对实际的编程语言很新,而Python是我的第一个.我知道我在Linux上的方式,足以获得暑期工作(我还在上高中),在工作中,我有很多空闲时间,我正在学习Python.

有一件事让我感到高兴.当你有像这样的表达式时,Python究竟有什么不同

x.__add__(y) <==> x+y
x.__getattribute__('foo') <==> x.foo
Run Code Online (Sandbox Code Playgroud)

我知道什么方法做什么和做什么,我得到他们做的,但我的问题是:上面的双下划线方法与它们更简单的等价方法有何不同?

PS,我不介意在编程历史上讲课,事实上,我发现知道它非常有用:)如果这些主要是Python的历史方面,请随意开始漫步.

Ste*_*ski 29

以下是Python的创建者解释它:

...而不是为特殊类的类方法(例如初始化器和析构函数)设计新语法,我决定只需要用户实现具有特殊名称(如__init__,__del__等等)的方法即可处理这些功能.此命名约定取自C,其中以下划线开头的标识符由编译器保留,并且通常具有特殊含义(例如,诸如__FILE__C预处理器中的宏 ).

...

我还使用这种技术来允许用户类重新定义Python运算符的行为.如前所述,Python在C中实现,并使用函数指针表来实现内置对象的各种功能(例如,"get attribute","add"和"call").以允许在用户定义的类中定义这些能力,我映射的各种函数指针特殊方法的名字,如__getattr__, __add__,和__call__.这些名称与在C中实现新的Python对象时必须定义的函数指针表之间存在直接对应关系.


mip*_*adi 16

当您使用两个下划线(并且没有尾随下划线)启动方法时,将应用Python的名称修改规则.这是一种private从其他OO语言(如C++和Java)中松散地模拟关键字的方法.(尽管如此,该方法在技术上仍然不像Java和C++方法是私有的那样是私有的,但是从实例外部"更难以获取".)

具有两个前导和两个尾随下划线的方法被认为是"内置"方法,即它们被解释器使用并且通常是重载操作符或其他内置功能的具体实现.

  • 从我所听到的,你通常不会使用`__`导致私有,而是当你的函数可能踩到另一个的命名空间时使用它.考虑到这一点,我看到有人说使用单个下划线将其标记为"实现细节". (4认同)

小智 7

那么,程序员的力量是好的,所以应该有一种方法来定制行为.像运算符重载(__add__,__div__,__ge__,...),属性访问(__getattribute__,__getattr__(这两个是不同的充),__delattr__...)等等.在许多情况下,如操作者,通常的语法图1:1至相应的方法.在其他情况下,有一个特殊的过程,在某些时候涉及调用相应的方法 - 例如,__getattr__只有在对象没有所请求的属性__getattribute__且未实现或引发AttributeError 时才调用.其中一些是非常高级的主题,可以让你深入了解对象系统的内容并且很少需要.因此无需全部学习,只需在需要/想知道时查阅参考资料.说到参考,在这里.


Pau*_*han 5

它们用于指定 Python 解释器应在特定情况下使用它们。

例如,该__add__函数允许+操作员为自定义类工作。否则,在尝试添加时,您将收到某种未定义的错误。