ITPub博客

首页 > 应用开发 > > python中单下划线(_)和双下划线(__)的特殊用法!还等什么

python中单下划线(_)和双下划线(__)的特殊用法!还等什么

作者:welchang 时间:2019-09-20 16:16:36 0 删除 编辑

单下划线开头(_)

在模块中使用单下划线开头模块中使用单下划线(_)开头定义函数、全局变量和类不能被模块外部以: 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_

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4830/viewspace-3121984/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-07-17

  • 博文量
    252
  • 访问量
    17991