浅谈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读写excel的方法
Nov 18 Python
Python使用shelve模块实现简单数据存储的方法
May 20 Python
python实现协同过滤推荐算法完整代码示例
Dec 15 Python
PyQt5每天必学之关闭窗口
Apr 19 Python
Python实现Restful API的例子
Aug 31 Python
python 内置函数汇总详解
Sep 16 Python
浅谈Python3实现两个矩形的交并比(IoU)
Jan 18 Python
Python进程间通信multiprocess代码实例
Mar 18 Python
使用Nibabel库对nii格式图像的读写操作
Jul 01 Python
如何在scrapy中集成selenium爬取网页的方法
Nov 18 Python
怎么用Python识别手势数字
Jun 07 Python
Python机器学习之底层实现KNN
Jun 20 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
FirePHP 推荐一款PHP调试工具
2011/04/23 PHP
ThinkPHP3.1新特性之Action参数绑定
2014/06/19 PHP
windows下的WAMP环境搭建图文教程(推荐)
2017/07/27 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
2017/12/21 PHP
浅谈laravel框架与thinkPHP框架的区别
2019/10/23 PHP
Extjs TimeField 显示正常时间格式的代码
2011/06/28 Javascript
HTML复选框和单选框 checkbox和radio事件介绍
2012/12/12 Javascript
jQuery用unbind方法去掉hover事件及其他方法介绍
2013/03/18 Javascript
node.js中的fs.fchmodSync方法使用说明
2014/12/16 Javascript
jQuery源码分析之Callbacks详解
2015/03/13 Javascript
JavaScript原生对象之Number对象的属性和方法详解
2015/03/13 Javascript
JS获取Table中td值的方法
2015/03/19 Javascript
JavaScript控制图片加载完成后调用回调函数的方法
2015/03/20 Javascript
在AngularJS中如何使用谷歌地图把当前位置显示出来
2016/01/25 Javascript
JS复杂判断的更优雅写法代码详解
2018/11/07 Javascript
Vue表单控件绑定图文详解
2019/02/11 Javascript
jquery实现自定义树形表格的方法【自定义树形结构table】
2019/07/12 jQuery
如何解决日期函数new Date()浏览器兼容性问题
2019/09/11 Javascript
[02:10]三分钟回顾完美世界城市挑战赛
2019/01/24 DOTA
[36:33]完美世界DOTA2联赛循环赛 Matador vs Forest 第一场 11.06
2020/11/06 DOTA
python三元运算符实现方法
2013/12/17 Python
更改Python命令行交互提示符的方法
2015/01/14 Python
python基于物品协同过滤算法实现代码
2018/05/31 Python
Python+OpenCV目标跟踪实现基本的运动检测
2018/07/10 Python
一步步教你用python的scrapy编写一个爬虫
2019/04/17 Python
纯CSS3实现滚动的齿轮动画效果
2014/06/05 HTML / CSS
Scholastic父母商店:儿童书籍
2017/01/01 全球购物
澳大利亚汽车零部件、音响及配件超市:Automotive Superstore
2018/06/19 全球购物
String这个类型的class为何定义成final?
2012/11/13 面试题
什么是.net的Remoting技术
2016/07/08 面试题
法学个人求职信范文
2014/01/27 职场文书
销售员岗位职责
2014/06/09 职场文书
2014年宣传工作总结
2014/11/18 职场文书
优秀班主任先进事迹材料
2014/12/16 职场文书
小学安全教育主题班会
2015/08/12 职场文书
MySQL索引篇之千万级数据实战测试
2021/04/05 MySQL