python中的标识符可以包含数字、字母和_,但必须以字母或者_开头,其中以_开头的命名一般具有特殊的意义

目录

单前置下划线的名字:

1、作为类名或函数名时,

2、作为类的属性名或方法名时

前后均带有双下划线__的命名

仅开头带双下划线__的命名


单前置下划线的名字:

《流畅的python》作者称之为“受保护的”名字,有两种主要的用法:

1、作为类名或函数名时,

会阻止其他python脚本通过【from module import *】语句导入该名字,即该名字不会被星号匹配;

"""foo.py模块"""
def add(a, b):"""待导入的函数,是个公有的名字"""return a+bdef _add2(a, b):"""待导入的函数,是个受保护的名字"""return a+b

比如,对于上面的模块foo,如果我在另一个python脚本中使用【from foo import *】语句,实际上是访问不到_add2()函数的,但是如果我使用【from foo import add, _add2】语句,则两个函数都能被访问到。

2、作为类的属性名或方法名时

,意为不希望下游的程序员直接访问该名字,而导致意外覆盖该属性,但是这只是一种【命名约定】,python解释器不会对这种属性名做特殊处理。只是表示类的定义者希望这些属性或者方法是"私有的",但实际上并不会起任何作用。

前后均带有双下划线__的命名

一般用于特殊方法的命名,用来实现对象的一些行为或者功能,比如

  1. __new__()方法用来创建实例,
  2. __init__()方法用来初始化对象,
  3. x + y操作被映射为方法x.__add__(y),序列或者字典的索引操作x[k]映射为x.__getitem__(k),
  4. __len__()、__str__()分别被内置函数len()、str()调用等等。

仅开头带双下划线__的命名

用于对象的数据封装,以此命名的属性或者方法为类的私有属性或者私有方法。

1

2

3

4

5

6

7

8

9

10

11

12

class Foo(object):

    def __init__(self):

        self.__name = 'private name'

    def getname(self):

        return self.__name

    def __spam(self):

        print 'private method'

    def bar(self):

        self.__spam()

如果在外部直接访问私有属性或者方法:是不可行的,这就起到了隐藏数据的作用,

1

2

3

4

5

6

7

8

9

10

11

12

13

>>> f = Foo()

>>> f.__name

Traceback (most recent call last):

  File "<pyshell#1>", line 1in <module>

    f.__name

AttributeError: 'Foo' object has no attribute '__name'

>>> f.__spam()

Traceback (most recent call last):

  File "<pyshell#2>", line 1in <module>

    f.__spam()

AttributeError: 'Foo' object has no attribute '__spam'

但是这种实现机制并不是很严格,机制是通过自动"变形"实现的,类中所有以双下划线开头的名称__name都会自动变为"_类名__name"的新名称:

1

2

3

4

>>> f._Foo__name

'private name'

>>> f._Foo__spam()

private method

这样就可以访问了。

这种机制可以阻止继承类重新定义或者更改方法的实现,比如,定义一个Foo的派生类:

1

2

3

class Goo(Foo):

    def __spam(self):

        print 'private method of Goo'

重写了__spam方法,运行:

1

2

3

>>> g = Goo()

>>> g.bar()

private method

调用bar()方法的时候依然执行的是Foo类的__spam()方法,因为在bar()方法的实现中,self.__spam()已自动变形为self._Foo__spam(),Goo继承的bar()方法也是如此,注意此时运行的是父类中的私有化方法,而不是子类重写的方法

Python带_的变量或函数命名,带下划线的方法相关推荐

  1. python命名规则数字开头的成语_浅谈Python中带_的变量或函数命名

    搜索热词 Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下,不同程序员编写的 Python 代码可以保持最大程度的相似风格.这样就 ...

  2. Python中带下划线_的变量和函数命名的用法

    Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下,不同程序员编写的 Python 代码可以保持最大程度的相似风格.这样就易于阅读, ...

  3. JavaScript常见变量和函数命名示例

    JavaScript作为前端开发从业人员必须掌握的3大基础知识中最重要的一环,也是平是接触时间最长.写得最多的.在开发过程中必然会遇到命名的问题,你会词穷.纠结.惆怅吗?本文的出现相信能够解决大部分烦 ...

  4. Visual Studio Code(VS code) python代码无法进行变量和函数跳转

    Visual Studio Code python代码无法进行变量和函数跳转 今天早上打开VC code发现竟然无法进行跳转,同时报下面这个错误 The Python Tools server cra ...

  5. python中不被定义_一日一技:在Python中双下划线私有方法不能被调用的原理

    一日一技:在Python中双下划线私有方法不能被调用的原理 在使用Python编写面向对象的代码时,我们会常常使用"继承"这种开发方式.例如下面这一段代码: class Info: ...

  6. python双下划线什么意思_python中_、__、__xx__(单下划线、双下划线等)的含义

    (1)_xxx "单下划线 " 开始的成员变量相当于私有变量,也叫做保护变量,意思是只有类实例和子类实例能访问到这些变量,需通过类提供的接口进行访问(可以定义有点像java中的ge ...

  7. [C语言]指针之数组逆序函数:编写函数invert,将数组中的n个整数按相反顺序存放,要求用指针变量作为函数形参,并用指针的方法遍历该数组。在main函数中输入n个整数,存入数组a中;然后调用上述函

    编写函数invert,将数组中的n个整数按相反顺序存放,要求用指针变量作为函数形参,并用指针的方法遍历该数组. 在main函数中输入n个整数,存入数组a中:然后调用上述函数处理数组a,最后逐个输出数组 ...

  8. 【Python 函数前的下划线】

    目录 1. 函数前的下划线的分类 2. 两种下划线的区别 1. 函数前的下划线的分类 Python函数前的下划线分为单下划线和双下划线两种: # 单下划线 def _add():...return# ...

  9. python添加横线代码_Python中的五种下划线

    1 1.单前导下划线 _var2 3 单个下划线是一个Python命名约定,表示这个名称是供内部使用的. 它通常不由Python解释器强制执行,仅仅作为一种对程序员的提示4 5 程序员使用名称前的单下 ...

最新文章

  1. ggThemeAssist:鼠标调整ggplot2主题,不用再记这些代码啦!
  2. 50年前,Hello World发明者第一次提交的Go代码长这样……
  3. 软件工程 第二周作业
  4. 数据挖掘建模之常见概率分布总结
  5. C#中的 隐式与显式接口实现
  6. mysql group by与order by的研究--分类中最新的内容
  7. chkconfig命令会立即生效吗_UG绘制波纹管,整体变形命令你会用吗?
  8. 【人工智能】全网首发!2020年AI、CV、NLP等最全国际会议、顶会时间汇总!!
  9. linux 进程间通信机制(IPC机制)一消息队列
  10. java 字符串的字节数_在Java中怎么计算字符编码和字符串所占字节数 .
  11. rem css calc,关于使用rem单位、css函数calc()进行自适应布局
  12. 【使用python和flask建个人博客】给个人博客增加了清单分类及计时功能,可以很方便的做时间记录,目标是为了能够跟柳比歇夫学习
  13. 电子邮箱的格式怎么填?外贸电子邮件填写的正确格式
  14. Java实现多线程远程投屏并打包可执行文件(从代码到.exe)
  15. 怎样屏蔽百度搜索侧边栏推荐以及热搜榜广告
  16. word如何设置上标形式_word如何将107中的7设置为上标表示形式
  17. leetcode数据库题目1-123题(20-08-14)(1)
  18. 异步爬虫“该文章已下线” 、“mrd参数”解决方法
  19. jmeter录制https请求
  20. 红酒宴会,如何更优雅的碰杯

热门文章

  1. 一台云服务器绕过企业微信域名验证本地开发
  2. YouTube儿童版的四种选择(其中不包含令人毛骨悚然的假视频)
  3. 佳博 TSC打印机 TSPL指令开发
  4. PAZU -- 4Fang WEB 打印控件
  5. 基于Springboot健身会员俱乐部管理系统设计
  6. 如何查看磁盘是GUID格式(GPT)还是MBR格式?判别UEFI模式启动,还是Legacy模式启动?
  7. 大一学生作品《前端框架开发技术》 期末网页制作 HTML+CSS+JavaScript 个人主页网页设计实例
  8. Linux中如何切换中文英文
  9. 解决 HBuilderX 控制台报libpng warning: iCCP: cHRM chunk does not match sRGB的问题
  10. Windows Sever 2016 创建DNS服务器并配置转发器及条件转发器