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)

  1. 无法使用初始的名称进行访问,重新定义属性的名称
  2. 变量私有,不会被派生类继承,仅仅自己使用
  3. 避免派生类和父类属性名称的冲突
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_ 避免重命名
posted @ 2021-11-25 21:51  贝壳里的星海  阅读(87)  评论(0编辑  收藏  举报