9.python-下划线
python-单双下划线
前、单下划线
前、单下划线 _xxx
作为python的命名规则,仅仅内部使用,
标明是一个受保护(protected)的变量,原则上不允许直接访问,但外部类还是可以访问到这个变量。这只是一个约定。
-
在
from modlue import *
时,不会导入。 -
但是使用
__all__=["name","age"]
单独申明的可以导入
class Person(object):
def __init__(self,name,age):
self.name = name
self._age = age
def play(self):
print(self.name,self._age)
def main():
p = Person('王大锤',12)
p.play()
"""
'单下划线'的保护变量
大多数Python程序员会遵循一种命名惯例就是让属性名以单下划线开头来表示属性是受保护的,
本类之外的代码在访问这样的属性时应该要保持慎重。
"""
print(p._age)
if __name__ == '__main__':
main()
# 12
前、双下划线
使用前导双下划线的 __xxx
的
私有类型(private)的变量。只能允许这个类对象本身进行访问, 连子类、实例对象也不可以访问,用于命名一个类属性(类变量)
调用时名字被改变(在类Student内部,__name
变成_Student__name
,如 self._Student__name
)
- 无法使用初始的名称进行访问,重新定义属性的名称
- 变量私有,不会被派生类继承,仅仅自己使用
- 避免派生类和父类属性名称的冲突
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']
-
self.foo
变量在属性列表中显示为未修改为foo
。 -
self._bar
的行为方式相同 - 它以_bar的形式显示在类上。 就像我之前说过的,在这种情况下,前导下划线仅仅是一个约定。 给程序员一个提示而已。 -
self.__baz
而言,情况看起来有点不同。 当你在该列表中搜索__baz
时,你会看不到有这个名字的变量,而是变成了_Test__baz
。 -
可以使属性变量私有不会被派生类去继承,仅仅能自己使用,无法通过继承进行覆盖
-
避免派生类和父类的属性名字冲突
后、单下划线
xxx_
,单下划线结尾的变量一般只是为了避免与 Python 关键字的命名冲突。
总结
模式 | 案例 | 含义 |
---|---|---|
前导、单下划线 | _var |
命名约定,仅仅内部使用,只对程序员提示 |
前导、双下划线 | __var |
仅在当前内,外部、子类均无法调用和继承 |
前后、双下划线 | __var__ |
内部魔术方法 |
后、单下划线 | var_ |
避免重命名 |