浅谈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 初始化多维数组代码
Sep 06 Python
几个提升Python运行效率的方法之间的对比
Apr 03 Python
编写Python脚本把sqlAlchemy对象转换成dict的教程
May 29 Python
Python实现的归并排序算法示例
Nov 21 Python
tensorflow学习教程之文本分类详析
Aug 07 Python
python之mock模块基本使用方法详解
Jun 27 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
Jul 07 Python
PyQt5基本控件使用详解:单选按钮、复选框、下拉框
Aug 05 Python
Django中reverse反转并且传递参数的方法
Aug 06 Python
使用IDLE的Python shell窗口实例详解
Nov 19 Python
python 经典数字滤波实例
Dec 16 Python
python用Configobj模块读取配置文件
Sep 26 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
为什么《星际争霸》是测试人工智能的理想战场
2019/12/03 星际争霸
php 读取文件乱码问题
2010/02/20 PHP
php数组函数序列之array_key_exists() - 查找数组键名是否存在
2011/10/29 PHP
PHP支付系统设计与典型案例分享
2016/08/02 PHP
ThinkPHP5.0框架实现切换数据库的方法分析
2019/10/30 PHP
自己写的兼容ie和ff的在线文本编辑器类似ewebeditor
2012/12/12 Javascript
详解jquery uploadify 上传文件
2013/11/09 Javascript
直接在JS里创建JSON数据然后遍历使用
2014/07/25 Javascript
javascript 获取函数形参个数
2014/07/31 Javascript
详解AngularJS中的表格使用
2015/06/16 Javascript
使用js复制链接中的部分文字的方法
2015/07/30 Javascript
php基于redis处理session的方法
2016/03/14 Javascript
javascript关于继承解析
2016/05/10 Javascript
jquery实现点击页面回到顶部
2016/11/23 Javascript
BootStrap表单验证 FormValidation 调整反馈图标位置的实例代码
2017/05/17 Javascript
vue配置多页面的实现方法
2018/05/22 Javascript
Vue+Webpack完美整合富文本编辑器TinyMce的方法
2018/11/30 Javascript
详解ECMAScript2019/ES10新属性
2019/12/06 Javascript
[01:46]TI4西雅图DOTA2前线报道 中国选手抱团调时差
2014/07/08 DOTA
python正则表达式中的括号匹配问题
2014/12/14 Python
python通过自定义isnumber函数判断字符串是否为数字的方法
2015/04/23 Python
Python环境下安装使用异步任务队列包Celery的基础教程
2016/05/07 Python
Python3.x对JSON的一些操作示例
2017/09/01 Python
对Python Class之间函数的调用关系详解
2019/01/23 Python
简单了解python反射机制的一些知识
2019/07/13 Python
Pytorch 保存模型生成图片方式
2020/01/10 Python
Python:__eq__和__str__函数的使用示例
2020/09/26 Python
Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
2020/12/07 Python
美国班级戒指、帽子和礼服、毕业产品、年鉴:Balfour
2018/11/01 全球购物
迪士尼英国官方商店:shopDisney UK
2019/09/21 全球购物
六道php面试题附答案
2014/06/05 面试题
如何从一个文件档案的尾端新增记录
2016/12/02 面试题
代码中finally中的代码会不会执行
2012/02/06 面试题
师德建设实施方案
2014/03/21 职场文书
管辖权异议上诉状
2015/05/23 职场文书
Django中celery的使用项目实例
2022/07/07 Python