学交互设计网站,建筑网官网下载,asp网站图片,网站后台管理增加功能本文介绍了Python中单下划线和双下划线的5种表现形式#xff0c;以及一些使用方法。其中有一些含义仅仅是依照约定#xff0c;被视作是对程序员的提示#xff0c;而有一些含义是由Python解释器严格执行的。
单前导下划线#xff1a;_var单末尾下划线#xff1a;var_双前导…本文介绍了Python中单下划线和双下划线的5种表现形式以及一些使用方法。其中有一些含义仅仅是依照约定被视作是对程序员的提示而有一些含义是由Python解释器严格执行的。
单前导下划线_var单末尾下划线var_双前导下划线__var双前导和末尾下划线__var__单下划线_
1.单前导下划线 _var
下划线前缀的含义是告知其他程序员以单个下划线开头的变量或方法仅供内部使用。 该约定在PEP 8中有定义。这不是Python强制规定的。而是一个约定俗成的含义。 它是对程序员的一个提示意味着Python社区一致认为它应该是什么意思但程序的行为不受影响。 例子:
class Test:def __init__(self):self.foo 11self._bar 23实例化此类并尝试访问在__init__构造函数中定义的foo和_bar属性会发生什么情况 t Test()t.foo
11t._bar
23你会看到_bar中的单个下划线并没有阻止我们“进入”类并访问该变量的值。这是因为Python中的单个下划线前缀仅仅是一个约定。 但是如果使用通配符从模块中导入所有名称则Python不会导入带有前导下划线的名称。 from my_module import *external_func()
23_internal_func()
NameError: name _internal_func is not defined2. 单末尾下划线 var_
有时候一个变量的最合适的名称已经被一个关键字所占用。 因此像class或def这样的名称不能用作Python中的变量名称。 在这种情况下你可以附加一个下划线来解决命名冲突 def make_object(name, class):
SyntaxError: invalid syntax def make_object(name, class_):
... pass总之单个末尾下划线后缀是一个约定用来避免与Python关键字产生命名冲突。 PEP 8解释了这个约定。
3. 双前导下划线 __var
①名称改写 双下划线还可用于名称改写即将属性或方法前面的双下划线和类名组合起来以防止子类意外覆盖父类的属性或方法。
class Test:def __init__(self):self.foo 11self._bar 23self.__baz 23让我们用内置的dir()函数来看看这个对象的属性 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]以上是这个对象属性的列表。 让我们来看看这个列表并寻找我们的原始变量名称foo_bar和__baz 我保证你会注意到一些有趣的变化。
self.foo变量在属性列表中显示为未修改为foo。 self._bar的行为方式相同 - 它以_bar的形式显示在类上。 就像我之前说过的在这种情况下前导下划线仅仅是一个约定。 给程序员一个提示而已。 然而对于self.__baz而言情况看起来有点不同。 当你在该列表中搜索__baz时你会看不到有这个名字的变量。
__baz出什么情况了
如果你仔细观察你会看到此对象上有一个名为_Test__baz的属性。 这就是Python解释器所做的名称修饰。 它这样做是为了防止变量在子类中被重写。
②名称修饰 双下划线用于名称修饰即将属性或方法前面的双下划线作为前缀使其成为私有成员。私有成员只能在类内部访问无法在类外部直接访问
class ManglingTest:def __init__(self):self.__mangled hellodef get_mangled(self):return self.__mangled ManglingTest().get_mangled()
helloManglingTest().__mangled
AttributeError: ManglingTest object has no attribute __mangled4. 双前导和双末尾下划线__var__
以双下划线开头结尾的变量不会被python解释器修改。 以双下划线开头结尾的方法在python中称为魔法方法。这样的例子有__init__对象构造函数或__call__ ,它使得一个对象可以被调用。 为了避免与将来Python语言的变化产生冲突我应该避免使用双下划线开头和结尾的名称。
5.单下划线 _
按照习惯有时候单个独立下划线是用作一个名字来表示某个变量是临时的或无关紧要的。
例如在下面的循环中我们不需要访问正在运行的索引我们可以使用“_”来表示它只是一个临时值 for _ in range(32):
... print(Hello, World.)你也可以在拆分(unpacking)表达式中将单个下划线用作“不关心的”变量以忽略特定的值。 同样这个含义只是“依照约定”并不会在Python解释器中触发特殊的行为。 单个下划线仅仅是一个有效的变量名称会有这个用途而已。 car (red, auto, 12, 3812.4)color, _, _, mileage car color
redmileage
3812.4_
126.总结
模式格式含义单前导下划线_var命名约定仅供内部使用单末尾下划线var_命名约定避免与其他关键字命名冲突双前导双末尾下划线__var触发“名称修饰”仅能在内部调用双前导双末尾下划线__var__魔法方法单下划线_用作临时或者无意义的变量名称