浅谈Python中带_的变量或函数命名


Posted in Python onDecember 04, 2017

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

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

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

一般用于特殊方法的命名,用来实现对象的一些行为或者功能,比如__new__()方法用来创建实例,__init__()方法用来初始化对象,

x + y操作被映射为方法x.__add__(y),序列或者字典的索引操作x[k]映射为x.__getitem__(k),__len__()、__str__()分别被内置函数len()、str()调用等等。

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

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

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()

如果在外部直接访问私有属性或者方法:

>>> f = Foo()
>>> f.__name
 
Traceback (most recent call last):
 File "<pyshell#1>", line 1, in <module>
  f.__name
AttributeError: 'Foo' object has no attribute '__name'
>>> f.__spam()
 
Traceback (most recent call last):
 File "<pyshell#2>", line 1, in <module>
  f.__spam()
AttributeError: 'Foo' object has no attribute '__spam'

是不可行的,这就起到了隐藏数据的作用,但是这种实现机制并不是很严格,机制是通过自动"变形"实现的,类中所有以双下划线开头的名称__name都会自动变为"_类名__name"的新名称:

>>> f._Foo__name
'private name'
>>> f._Foo__spam()
private method

这样就可以访问了。

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

class Goo(Foo):
  def __spam(self):
    print 'private method of Goo'

重写了__spam方法,运行:

>>> g = Goo()
>>> g.bar()
private method

调用bar()方法的时候依然执行的是Foo类的__spam()方法,因为在bar()方法的实现中,self.__spam()已自动变形为self._Foo__spam(),Goo继承的bar()方法也是如此。

以单下划线_开头的命名

一般用于模块中的"私有"定义的命名。

from module import * 语句用于加载模块中的所有名称,要控制导入的名称,一种方法是定义列表__all__,只有在__all__中的名称才能通过*导入,

另一种方法就是以单下划线开头命名定义了,这种定义不会被*导入。

当然,在类中也可以用单下划线开头来命名属性或者方法,这只是表示类的定义者希望这些属性或者方法是"私有的",但实际上并不会起任何作用。

总结

以上就是本文关于浅谈Python中带_的变量或函数命名的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
Django ORM框架的定时任务如何使用详解
Oct 19 Python
python如何让类支持比较运算
Mar 20 Python
Python基于win32ui模块创建弹出式菜单示例
May 09 Python
对Python3.6 IDLE常用快捷键介绍
Jul 16 Python
python三引号输出方法
Feb 27 Python
python如何通过闭包实现计算器的功能
Feb 22 Python
使用Python和百度语音识别生成视频字幕的实现
Apr 09 Python
解决Django响应JsonResponse返回json格式数据报错问题
Aug 09 Python
自定义Django_rest_framework_jwt登陆错误返回的解决
Oct 18 Python
用python-webdriver实现自动填表的示例代码
Jan 13 Python
Python time库的时间时钟处理
May 02 Python
python读取并查看npz/npy文件数据以及数据显示方法
Apr 14 Python
Python中对象的引用与复制代码示例
Dec 04 #Python
Python3 Random模块代码详解
Dec 04 #Python
利用python爬取斗鱼app中照片方法实例
Dec 03 #Python
CentOS 6.5中安装Python 3.6.2的方法步骤
Dec 03 #Python
python3利用smtplib通过qq邮箱发送邮件方法示例
Dec 03 #Python
Python中类的初始化特殊方法
Dec 01 #Python
Python抓取框架Scrapy爬虫入门:页面提取
Dec 01 #Python
You might like
php实现文本数据导入SQL SERVER
2015/05/17 PHP
php文件操作小结(删除指定文件/获取文件夹下的文件名/读取文件夹下图片名)
2016/05/09 PHP
thinkPHP5 ACL用户权限模块用法详解
2017/05/10 PHP
Javascript 实现TreeView CheckBox全选效果
2010/01/11 Javascript
使用JavaScript检测Firefox浏览器是否启用了Firebug的代码
2010/12/28 Javascript
javascript权威指南 学习笔记之javascript数据类型
2011/09/24 Javascript
jQuery学习笔记 操作jQuery对象 属性处理
2012/09/19 Javascript
javascript删除option选项的多种方法总结
2013/11/22 Javascript
js post提交调用方法
2014/02/12 Javascript
判断window.onload是否多次使用的方法
2014/09/21 Javascript
jquery判断单选按钮radio是否选中的方法
2015/05/05 Javascript
Jquery日期选择datepicker插件用法实例分析
2015/06/08 Javascript
利用Query+bootstrap和js两种方式实现日期选择器
2017/01/10 Javascript
如何使用Bootstrap 按钮实例详解
2017/03/29 Javascript
JavaScript实现时间表动态效果
2017/07/15 Javascript
JavaScript实现无刷新上传预览图片功能
2017/08/02 Javascript
Javascript实现异步编程的过程
2018/06/18 Javascript
配置eslint规范项目代码风格
2019/03/11 Javascript
深入了解JavaScript代码覆盖
2019/06/13 Javascript
layui操作列按钮个数和文字颜色的判断实例
2019/09/11 Javascript
基于进程内通讯的python聊天室实现方法
2015/06/28 Python
详解Python中的Descriptor描述符类
2016/06/14 Python
python selenium 对浏览器标签页进行关闭和切换的方法
2018/05/21 Python
python石头剪刀布小游戏(三局两胜制)
2021/01/20 Python
python检测服务器端口代码实例
2019/08/31 Python
scrapy redis配置文件setting参数详解
2020/11/18 Python
python UDF 实现对csv批量md5加密操作
2021/01/01 Python
Python截图并保存的具体实例
2021/01/14 Python
CSS3中几个新增加的盒模型属性使用教程
2016/03/01 HTML / CSS
迷你唐卡软皮鞋:Minnetonka Moccasin
2018/05/01 全球购物
what is the difference between ext2 and ext3
2013/11/03 面试题
工程预算与管理应届生求职信
2013/10/06 职场文书
机械设计专业应届生求职信
2013/11/21 职场文书
班主任经验交流会主持词
2014/04/01 职场文书
党员转正意见怎么写
2015/06/03 职场文书
SpringCloud的JPA连接PostgreSql的教程
2021/06/26 Java/Android