0%

python中方法及变量的下划线双下划线等含义

#Python 下划线、双下划线

一般常见的下划线为以下几种:

  • 前置单下划线:_var
  • 后置单下划线:var_
  • 前置双下划线:__var
  • 前后双下划线:__var__
  • 单下划线:_

###1. 前置单下划线变量和单下划线方法的区别:

前置单下划线表示在方法内部使用,单下划线变量可以从外部引用,而单下划线方法在使用通配符导入包时(from package import *)不可以,除非使用import package,然后使用”package._model”进行使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Test:
def __init__(self):
self.foo = 11
self._bar = 23
>>> t = Test()
>>> t.foo
11
>>> t._bar
23

# my_module.py:
def external_func():
return 23
def _internal_func():
return 42
>>> from my_module import *
>>> external_func()
23
>>> _internal_func()
NameError: "name '_internal_func' is not defined"

>>> import my_module
>>> my_module.external_func()
23
>>> my_module._internal_func()
42

2. 后置单下划线

当需要使用的最合适的变量名与关键字所重复,可以使用后置单下划线来绕过命名冲突

1
2
3
4
5
>>> def make_object(name, class):
SyntaxError: "invalid syntax"

>>> def make_object(name, class_):
... pass

3. 前置双下划线

前置双下划线会被解释器进行命名改写。这个例子先声明_MangledGlobal__mangled为全局变量,然后在名为MangledGlobal的类环境中访问变量。由于名称改写,类中的test()方法仅用__mangled就能引用_MangledGlobal__mangled全局变量。__mangled以双下划线开头,因此Python解释器自动将名称扩展为_MangledGlobal__mangled。这表明名称改写不专门与类属性绑定,而是能够应用于类环境中所有以双下划线开头的名称

1
2
3
4
5
6
7
8
_MangledGlobal__mangled = 23

class MangledGlobal:
def test(self):
return __mangled

>>> MangledGlobal().test()
23

###4. 单独单下划线

单下划线有时用作名称,来表示变量是临时的或无关紧要的

1
2
3
例如下面的循环中并不需要访问运行的索引,那么可以使用_来表示它只是一个临时值:
>>> for _ in range(32):
... print('Hello, World.')

5.总结

  • 前置单下划线_var:命名约定,用来表示该名称仅在内部使用。一般对Python解释器没有特殊含义(通配符导入除外),只能作为对程序员的提示。
  • 后置单下划线var_:命名约定,用于避免与Python关键字发生命名冲突。
  • 前置双下划线__var:在类环境中使用时会触发名称改写,对Python解释器有特殊含义。
  • 前后双下划线__var__:表示由Python语言定义的特殊方法。在自定义的属性中要避免使用这种命名方式。
  • 单下划线_:有时用作临时或无意义变量的名称(“不关心”)。此外还能表示Python REPL会话中上一个表达式的结果。