python项目中会有大量的以下划线开头的属性,这些下划线开头的属性,开上去很奇怪,出现频率也很多,所以下面我总结了常见下划线的意义。
单下划线开头(_)
-
_
在代码中单独出现,这种情况_
表示一个零时变量。 这样别人看代码的时候,就知道这是一个没有意义的零时变量,比起叫tmp或者temp更加简洁。for _ in range(10): do_something_ten_times()
-
以 _ 开头的变量,如
_foo
,这样则表示或者约定该变量为私有变量。比如直接from <module> import *
就不会import单下划线开头的属性(除非手动在__all__
属性中声明)。 -
_
在解释器中出现,则表示上一个执行的结果,如:In [1]: 1 + 1 Out[1]: 2 In [2]: _ Out[2]: 2
双下划线开头(__)
- 双下划线开头以及结尾(
__init__
),这些一般都是python自带的一些magic method。之所以被双下划线包起来,是为了区别用户自己定义方法。 -
最少2个下划线开头,最多一个下划线结尾,python会对这些方法名加入类名后重组,如
In [1]: class A(object): ...: a = 1 ...: __b = 2 ...: def __f(self): ...: pass ...: In [2]: a = A() In [3]: dir(a) Out[3]: ['_A__b', '_A__f', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'a'] In [4]: getattr(a, 'a') Out[4]: 1 In [5]: getattr(a, '__b') --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-5-ae11a9e10a99> in <module>() ----> 1 getattr(a, '__b') AttributeError: 'A' object has no attribute '__b' In [6]: getattr(a, '_A__b') Out[6]: 2
a中的仅以双下划线开头的属性都被替换成了 _CLASSNAME__XX 的形式。这样就像java里面的final关键字一样,让这些属性不会被子类所重写。