[Python Basics]下划线变量

夜暗归云绕柁牙,江涵星影鹭眠沙。
行人怅望苏台柳,曾与吴王扫落花。

我平时很常见到的带有下划线的python变量有两种:

  1. 前后双下划线,我之前的理解是python程序中的类似meta data的信息,例如__name__变量
  2. 前单下划线,python类中的私有变量或函数
  3. 单独下划线,用来表示上一个输出(在python Interactive console中)。常见用法for _ in theList

今天遇到了一些新的挑战:

  • `from feature import absolute_import
  • author = "JOJO"

本着“留下记录以加强记忆”的美好愿景,我检索并选择这个网站的解释进行翻译(曾经我莫名其妙地不喜欢这种翻译工作,现在倒是受用得很。唉)

Python中有五种下划线变量

  • 前置单下划线
  • 后置单下划线
  • 前置双下划线
  • 前后双下划线
  • 单下划线

前置单下划线

import的时候,以前置单下划线开头的对象不会被引入(内部函数)

# This is 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"

但是作为常规引入(regular imports)的变量还是可以可以读的:

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

后置单下划线

一般来说,后置单下划线被用来避免和python内置关键词冲突

>>> def make_object(name, class):
SyntaxError: "invalid syntax"

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

前置双下划线

前置双下划线被称为命名撕裂?(name mangling)。python解释器在面对这种变量时会对变量重新命名,从而形成一种只有内部方法可以访问的效果(内部参数):

class Test:
    def __init__(self):
        self.foo = 11
        self._bar = 23
        self.__baz = 23
>>> t = Test()
>>> dir(t)
['_Test__baz', '__class__', '__delattr__', '__dict__', '__dir__',
 '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
 '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__',
 '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
 '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
 '__weakref__', '_bar', 'foo']
class ManglingTest:
    def __init__(self):
        self.__mangled = 'hello'

    def get_mangled(self):
        return self.__mangled

>>> ManglingTest().get_mangled()
'hello'
>>> ManglingTest().__mangled
AttributeError: "'ManglingTest' object has no attribute '__mangled'"

前后双下划线

这种变量被python解释器预留,命名和访问都是正常的。

单下划线

临时变量

接下来需要进行的工作:
PEP8规范编程

相关推荐