什么是Name_mangling以及python的下划线约定

name mangling (又叫name decoration命名修饰).在很多现代编程语言中,这一技术用来解决需要唯一名称而引起的问题,比如命名冲突/重载等.

在python中,双下划线开头的类变量就用到了name mangling技术,会自动加上类名前缀.

有什么用呢?可以防止意外在子类或者类外面被修改到.虽然单下划线开头的变量也有private的意味,但是更多的只是个约定,可以直接访问到.而双下划线开头的变量更彻底.

下面看代码.

#coding=utf-8
class A:
    def __init__(self):
        self.__foo = 'foo'
        self._bar = 'bar'
a = A()
print a.__dict__
print a._bar
print a.__foo #这句会报错

其中print a.__dict__输出{‘_A__foo‘: ‘foo‘, ‘_bar‘: ‘bar‘}

可以看到,__foo加上类名前缀变成了_A__foo.

下面汇总下python的下划线约定,

  • _xxx:表示内部使用,不能被from M imoprt *导入
  • xxx_:表示避免和关键字冲突,如Tkinter.Toplevel(master, class_=‘ClassName‘)
  • __xxx:更彻底的private.用到了name mangling技术,会自动加上类名前缀.不能被子类和类外访问.
  • __xxx__:魔术方法或用户控制的命名空间.

更多约定详情到http://www.python.org/dev/peps/pep-0008/#descriptive-naming-styles

时间: 2024-10-24 12:22:39

什么是Name_mangling以及python的下划线约定的相关文章

python 单下划线/双下划线使用总结(转载)

python 单下划线/双下划线使用总结 时间:2013-10-08 10:56来源:www.chengxuyuans.com Python 用下划线作为变量前缀和后缀指定特殊变量/方法. 主要存在四种情形1.    1. object # public    2. __object__ # special, python system use, user should not define like it    3. __object # private (name mangling duri

[python]专用下划线标识符

1. python用下划线作为变量前缀和后缀,来指定特殊变量. _xxx: 不用'from module import *'导入,一般被看作是私有的,在模块或类外不可用使用. __xxx__: 系统定义名字 __xxx: 类中的私有变量名 2. 判断模块是被导入还是被直接执行 如果模块是被导入,__name__的值为模块名字. 如果模块是被直接执行,__name__的值为'__main__'

python(七) Python中单下划线和双下划线

Python中单下划线和双下划线: 一.分类 (1).以单下划线开头,表示这是一个保护成员,只有类对象和子类对象自己能访问到这些变量. 以单下划线开头的变量和函数被默认是内部函数,使用from module improt *时不会被获取,但是使用import module可以获取. (2).以单下划线结尾仅仅是为了区别该名称与关键词 (3).双下划线开头,表示为私有成员,只允许类本身访问,子类也不行.在文本上被替换为_class__method  (4).双下划线开头,双下划线结尾.一种约定,P

Python中单下划线和双下划线

Python中单下划线和双下划线: 一.分类 (1).以单下划线开头,表示这是一个保护成员,只有类对象和子类对象自己能访问到这些变量. 以单下划线开头的变量和函数被默认是内部函数,使用from module import *时不会被获取,但是使用import module可以获取. (2).以单下划线结尾仅仅是为了区别该名称与关键词 (3).双下划线开头,表示为私有成员,只允许类本身访问,子类也不行.在文本上被替换为_class__method  (4).双下划线开头,双下划线结尾.一种约定,P

Python中单下划线开头的特性

1.带有单下划线的特性不会被 from module import *导入. 2.单下划线是Python程序员使用类时的约定,表明程序员不希望类的用户直接访问属性.仅仅是一种约定!实际上,实例._变量,可以被访问. 参考资料: http://blog.csdn.net/debugm/article/details/8179482

python——双下划线与python命名机制

python中双下划线的作用(1)所有以双下划线开头的成员是私有的(2)python对于私有变量是会进行扎压(mangling)的,扎压规则是原始定义:class A():    __function():          print '__function is private! '扎压之后:class A():    _A__function():          print '__function is private!' 同时,在class A中对于以前__function()的调用

python的下划线

首先是单下划线开头,这个被常用于模块中,在一个模块中以单下划线开头的变量和函数被默认当作内部函数,如果使用 from a_module import * 导入时,这部分变量和函数不会被导入.不过值得注意的是,如果使用 import a_module 这样导入模块,仍然可以用 a_module._some_var 这样的形式访问到这样的对象. 在 Python 的官方推荐的代码样式中,还有一种单下划线结尾的样式,这在解析时并没有特别的含义,但通常用于和 Python 关键词区分开来,比如如果我们需

python单下划线、双下划线、头尾双下划线说明:

单下划线.双下划线.头尾双下划线说明: __foo__: 定义的是特殊方法,一般是系统定义名字 ,类似 __init__() 之类的. _foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import * __foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了. 来源: http://www.runoob.com/python/python-object.htm

[Python Basics]下划线变量

夜暗归云绕柁牙,江涵星影鹭眠沙. 行人怅望苏台柳,曾与吴王扫落花. 我平时很常见到的带有下划线的python变量有两种: 前后双下划线,我之前的理解是python程序中的类似meta data的信息,例如__name__变量 前单下划线,python类中的私有变量或函数 单独下划线,用来表示上一个输出(在python Interactive console中).常见用法for _ in theList 今天遇到了一些新的挑战: `from feature import absolute_impo