Python中下划线的用法

Python中的下划线

Python 中的 _ 的不同用法绝大部分都是一种惯例约定。

单个下划线( _

解释器中

_ 符号代表交互解释器中的最后一次执行语句的结果。

作为名称使用

_ 用做被抛弃的名称。表示在后续的代码中,这个变量不会被使用到。

单下划线前缀( _XX

单下划线做前缀的名称约定了这个名称是『私有』的,但是这样的实例变量是可以在外部访问到的,但是按照 Python 的约定,看到单下划线前缀这样的变量时,可以理解为『 虽然我可以在外部被访问,但是请把我当做一个内部变量( private )来使用,不要随意访问 』

Python 程序员约定使用一个下划线前缀编写『受保护』的属性,如 self._x

Python 解释器不会对使用单个下划线的属性名做特殊处理,不过这是很多 Python 程序员严格遵守的约定,他们不会在类外访问这种属性。

Attributes with a single _ prefix are called “protected” in some corners of the Python documentation. The pracitce of “protecting” attributes by convention with the form self._x is widespread, but calling that a “protected” attribute is not so common. Some even call that a “private” attribute.

单下划线前缀的通常被用于模块中,在一个模块中以单下划线开头的变量和函数被默认视为内部函数,使用 from a_module import * 导入时,任何以单下划线开头的名称都不会被导入。如果使用 import a_module 这样导入模块时,仍然可以使用 a_module._var 这样的方式来访问到对象。

双下划线前缀的名称 ( __XX

通常用在类中,如果想要使得类的内部属性不被外部随意访问到,可以把属性名字加上双下划线前缀,在 Python 中的实例变量如果以双下划线作为前缀,则表示改变量表示一个私有变量 ( private ),只有在内部可以访问,外部是无法访问的。

双下划线前缀命名的形式并不是一种惯例:对解释器而言,Python 会改写这些名称,以免与子类中定义的这些名称发生冲突。任何 __method 这种形式的标识符,都会被 Python 解释器在文本上替换为 _classname__methodclassname 是所属类的名字。

也就是说,双下划线开头的实力变量并不是一定不能从外部进行访问的,仍然可以通过 _classname__method 形式访问到类中的内部变量 __method ,但是通常不建议这么做。

前后缀都为双下划线的名称( __XX__

表示 Python 中的特殊方法名,这也只是一种惯例,表示 Python 系统的名称不会跟用户的自定义名称发生冲突。通常我们可以自己重写这些方法,比如在类里面经常会重写 __init__() 方法。

特殊变量是可以直接访问的,不是 private 变量。

参考

你愿意请我喝瓶可乐吗?