浅谈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 collections模块实例讲解
Apr 07 Python
用Python代码来绘制彭罗斯点阵的教程
Apr 03 Python
在Python的Flask框架中实现全文搜索功能
Apr 20 Python
python通过socket实现多个连接并实现ssh功能详解
Nov 08 Python
python基础教程项目二之画幅好画
Apr 02 Python
Python用for循环实现九九乘法表
May 31 Python
python实现n个数中选出m个数的方法
Nov 13 Python
Python爬虫实现获取动态gif格式搞笑图片的方法示例
Dec 24 Python
flask session组件的使用示例
Dec 25 Python
简单了解django缓存方式及配置
Jul 19 Python
matplotlib基础绘图命令之imshow的使用
Aug 13 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
Dec 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
IIS下配置Php+Mysql+zend的图文教程
2006/12/08 PHP
Windows下php+mysql5.7配置教程
2017/05/16 PHP
深入理解JavaScript系列(2) 揭秘命名函数表达式
2012/01/15 Javascript
兼容ie、firefox的图片自动缩放的css跟js代码分享
2012/01/21 Javascript
调试Javascript代码(浏览器F12及VS中debugger关键字)
2013/01/25 Javascript
Firefox和IE兼容性问题及解决方法总结
2013/10/08 Javascript
Script标签与访问HTML页面详解
2014/01/10 Javascript
JS替换字符串中空格方法
2015/04/17 Javascript
js控制div弹出层实现方法
2015/05/11 Javascript
利用jQuery.Validate异步验证用户名是否存在(推荐)
2016/12/09 Javascript
谈谈对vue响应式数据更新的误解
2017/08/01 Javascript
微信小程序开发animation心跳动画效果
2017/08/16 Javascript
js原生实现移动端手指滑动轮播图效果的示例
2018/01/02 Javascript
JS实现的合并多个数组去重算法示例
2018/04/11 Javascript
nodejs npm错误Error:UNKNOWN:unknown error,mkdir 'D:\Develop\nodejs\node_global'at Error
2019/03/02 NodeJs
Vue通过for循环随机生成不同的颜色或随机数的实例
2019/11/09 Javascript
[00:27]DOTA2战队VP、Secret贺新春
2018/02/11 DOTA
Python随机生成彩票号码的方法
2015/03/05 Python
Python3实现腾讯云OCR识别
2018/11/27 Python
对Python中创建进程的两种方式以及进程池详解
2019/01/14 Python
selenium+python自动化测试之页面元素定位
2019/01/23 Python
Python制作动态字符图的实例
2019/01/27 Python
Python如何调用JS文件中的函数
2019/08/16 Python
关于python3.7安装matplotlib始终无法成功的问题的解决
2020/07/28 Python
CSS3实现类似翻书效果的过渡动画的示例代码
2019/09/06 HTML / CSS
为娇小女性量身打造:Petite Studio
2018/11/01 全球购物
Currentbody美国/加拿大:美容仪专家
2020/03/09 全球购物
工商管理专业职业生涯规划
2014/01/01 职场文书
四年级下册教学反思
2014/02/01 职场文书
优秀女职工事迹材料
2014/02/06 职场文书
2014年健康教育实施方案
2014/02/17 职场文书
大学新生军训方案
2014/05/03 职场文书
在校实习生求职信
2014/06/18 职场文书
公司领导班子四风对照检查材料
2014/09/27 职场文书
保护环境建议书作文400字
2015/09/14 职场文书
简历自我评价范文
2019/04/24 职场文书