浅谈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 相关文章推荐
python类继承用法实例分析
Oct 10 Python
Python中为什么要用self探讨
Apr 14 Python
Python输出PowerPoint(ppt)文件中全部文字信息的方法
Apr 28 Python
Python正则表达式使用经典实例
Jun 21 Python
Python利用ORM控制MongoDB(MongoEngine)的步骤全纪录
Sep 13 Python
基于python实现自动化办公学习笔记(CSV、word、Excel、PPT)
Aug 06 Python
基于python的selenium两种文件上传操作实现详解
Sep 19 Python
Python 中使用 PyMySQL模块操作数据库的方法
Nov 10 Python
python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例
Mar 04 Python
python time()的实例用法
Nov 03 Python
利用python如何实现猫捉老鼠小游戏
Dec 04 Python
利用Python+OpenCV三步去除水印
May 28 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判断变量是否为0的方法
2014/02/08 PHP
php获取json数据所有的节点路径
2015/05/17 PHP
js操作ajax返回的json的注意问题!
2010/02/23 Javascript
基于jQuery的树控件实现代码(asp.net+json)
2010/07/11 Javascript
jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮
2013/10/11 Javascript
jQuery添加/改变/移除CSS类及判断是否已经存在CSS
2014/08/20 Javascript
jquery实现删除一个元素后面的所有元素功能
2015/12/21 Javascript
表单中单选框添加选项和移除选项
2016/07/04 Javascript
Vue项目中quill-editor带样式编辑器的使用方法
2017/08/08 Javascript
JavaScript正则表达式函数总结(常用)
2018/02/22 Javascript
JS实现字符串中去除指定子字符串方法分析
2018/05/17 Javascript
vue中Axios的封装与API接口的管理详解
2018/08/09 Javascript
jQuery使用bind动态绑定事件无效的处理方法
2018/12/11 jQuery
微信小程序实现联动选择器
2019/02/15 Javascript
JSON是什么?有哪些优点?JSON和XML的区别?
2019/04/29 Javascript
解决layui数据表格table的横向滚动条显示问题
2019/09/04 Javascript
[00:27]DOTA2荣耀之路2:Patience from zhou!
2018/05/24 DOTA
[02:16]完美世界DOTA2联赛PWL S3 集锦第三期
2020/12/21 DOTA
python搜索指定目录的方法
2015/04/29 Python
TensorFlow 实战之实现卷积神经网络的实例讲解
2018/02/26 Python
Python常用字符串替换函数strip、replace及sub用法示例
2018/05/21 Python
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
2018/08/22 Python
让你的Python代码实现类型提示功能
2019/11/19 Python
Python使用matplotlib绘制Logistic曲线操作示例
2019/11/28 Python
Keras 实现加载预训练模型并冻结网络的层
2020/06/15 Python
使用html2canvas实现将html内容写入到canvas中生成图片
2020/01/03 HTML / CSS
美国男装连锁零售商:Men’s Wearhouse
2016/10/14 全球购物
美国猫狗药物和用品网站:PetCareRx
2017/01/05 全球购物
加拿大领先的优质厨具产品在线购物网站:Golda’s Kitchen
2017/11/17 全球购物
Peter Millar官网:美国高档生活服饰品牌
2018/07/02 全球购物
取保候审保证书
2014/04/30 职场文书
乡镇党的群众路线教育实践活动总结报告
2014/10/30 职场文书
2014年电工工作总结
2014/11/20 职场文书
匿名信格式范文
2015/05/27 职场文书
小组口号霸气押韵
2015/12/24 职场文书
Navicat for MySQL的使用教程详解
2021/05/27 MySQL