• python中单下划线(_)和双下划线(__)的特殊用法


    单下划线开头(_)

    • 在模块中使用单下划线开头
      模块中使用单下划线(_)开头定义函数、全局变量和类不能被模块外部以: from module import * 形式导入。
      但可以用:from module import _func 形式单独导入。
      当然定义函数、全局变量和类前面有2个或者更多下划线开头也不可以用 from module import * 的形式导入。
    # 单下划线开头的函数
    def _my_abs(num):
        return 'my_abs:' + str(abs(num))
    
    # 单下划线开头的全局变量
    _My_var
    
    # 单下划线开头的类
    _My_Class:
        pass
    
    
    • 在类中使用单下划线开头
      带单下划线的类变量、实例变量和方法,允许类内部、类实例和子类访问,不受限制。
      单下划线仅仅是一种私有申明约定,访问不受限制。

    双下划线开头(__)

    • 在class类的内部,带双下划线的类变量、实例变量、方法具有正常访问权限。
    • 在继承结构中,带双下划线的基类的类变量和实例变量不能被子类直接访问。
    • 在实例中,带双下划线的类变量、实例变量、方法不能被直接访问。但有办法间接访问。

    双下划线开头的类变量、实例变量、方法在继承和实例中可以间接访问

    双下划线开头的变量和方法替换为`单下划线+类名+双下划线开头的变量和方法`的形式,且双下划线开头的变量和方法后面最多只能以一个单下划线结束,否则也无法访问。
    
    class BaseCls:
        def __init__(self, name, age, nick_name):
            self.name = name
            self.__nick_name_ = nick_name  # __nick_name后面最多以一个_结束,否则通过基类名混淆的方式也无法访问了。
            self.age = age
    
    
    class SubCls(BaseCls):
        def __init__(self, name, age, addr, nick_name):
            super().__init__(name, age, nick_name)
            self.addr = addr
            self.a_nick_name = self._BaseCls__nick_name_ 
    
  • 相关阅读:
    mongo批量删除js示例
    Mongo压测介绍
    线性代数学习笔记(1)--二维向量点积本质(仅供自己理解)
    墨菲定律的正确解读
    spring cloud 2020.0.1踩坑记录-bootstrap不生效等
    记一次网络质量原因导致接口调用超时的调查过程
    .NET Debugging Demos Lab 2: Crash
    .NET Debugging Demos Lab 3: Memory
    Hang caused by GC
    .NET Debugging Demos Lab 4: High CPU hang
  • 原文地址:https://www.cnblogs.com/bryant24/p/11429653.html
Copyright © 2020-2023  润新知