如何/为什么这在python中工作?rover._Dog__password()

Auf*_*ind 3 python methods syntax private class

我正在做python koan(对于python 2.6)并且发现了一些我不理解的东西.其中一个文件在第160行中包含以下代码:

class Dog(object):
    def __password(self):
        return 'password'
Run Code Online (Sandbox Code Playgroud)

这个

rover = Dog()
password = rover.__password()
Run Code Online (Sandbox Code Playgroud)

结果是AttributeError.这对我来说很清楚.(__password(self)由于领先的两个下划线,是某种私人方法).

但是这个

rover._Dog__password()
Run Code Online (Sandbox Code Playgroud)

对我来说是一个谜.有人可以向我解释这是如何或为什么有效或更好地指向我所描述的文档?

San*_*nda 7

双下划线:

表单的任何标识符__spam(至少两个前导下划线,最多一个尾随下划线)在文本上替换为 _classname__spam,其中classname是当前类名称,其中前导下划线被剥离.这种修改是在不考虑标识符的句法位置的情况下完成的,因此它可以用于定义类私有实例和类变量,方法,存储在全局变量中的变量,甚至存储在实例中的变量.在其他类的实例上对此类私有.

所以当你打电话时__methodname,它只是一个电话_classname__methodname.结果是AttributeError

单下划线:

具有前导下划线的类中的变量只是向其他程序员指示该变量应该是私有的.但是,变量本身并没有什么特别之处.

Python文档在这里:

Python私有变量文档

完整帖子在这里找到:

在对象名称之前单引号和双下划线的含义是什么?