浅谈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 相关文章推荐
简单介绍利用TK在Python下进行GUI编程的教程
Apr 13 Python
如何将python中的List转化成dictionary
Aug 15 Python
浅谈python爬虫使用Selenium模拟浏览器行为
Feb 23 Python
深入浅析python with语句简介
Apr 11 Python
浅谈Python里面小数点精度的控制
Jul 16 Python
详解基于django实现的webssh简单例子
Jul 17 Python
python判断完全平方数的方法
Nov 13 Python
python实现推箱子游戏
Mar 25 Python
Python函数返回不定数量的值方法
Jan 22 Python
python Manager 之dict KeyError问题的解决
Dec 21 Python
对python中return与yield的区别详解
Mar 12 Python
如何解决pycharm调试报错的问题
Aug 06 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
hessian 在PHP中的使用介绍
2010/12/13 PHP
php addslashes及其他清除空格的方法是不安全的
2012/01/25 PHP
基于curl数据采集之单页面并行采集函数get_htmls的使用
2013/04/28 PHP
百度工程师讲PHP函数的实现原理及性能分析(一)
2015/05/13 PHP
手把手编写PHP框架 深入了解MVC运行流程
2016/09/19 PHP
php中的异常和错误浅析
2017/05/03 PHP
Extjs 几个方法的讨论
2010/01/28 Javascript
在IE6下发生Internet Explorer cannot open the Internet site错误
2010/06/21 Javascript
jquery.tmpl JQuery模板插件
2011/10/10 Javascript
jQuery学习笔记 操作jQuery对象 属性处理
2012/09/19 Javascript
js 异步操作回调函数如何控制执行顺序
2013/12/24 Javascript
jQuery性能优化的38个建议
2014/03/04 Javascript
自己封装的javascript事件队列函数版
2014/06/12 Javascript
js添加绑定事件的方法
2016/05/15 Javascript
BootStrap初学者对弹出框和进度条的使用感觉
2016/06/27 Javascript
Highcharts入门之基本属性
2016/08/02 Javascript
两行代码轻松搞定JavaScript日期验证
2016/08/03 Javascript
浅谈基于Vue.js的移动组件库cube-ui
2017/12/20 Javascript
JavaScript 隐性类型转换步骤浅析
2018/03/15 Javascript
layer弹出层 iframe层去掉滚动条的实例代码
2018/08/17 Javascript
微信小程序实现多选框全选与取消全选功能示例
2019/05/14 Javascript
[01:32]完美世界DOTA2联赛10月29日精彩集锦
2020/10/30 DOTA
使用Python脚本将Bing的每日图片作为桌面的教程
2015/05/04 Python
Python实现可获取网易页面所有文本信息的网易网络爬虫功能示例
2018/01/15 Python
python+opencv+caffe+摄像头做目标检测的实例代码
2018/08/03 Python
python 不同方式读取文件速度不同的实例
2018/11/09 Python
Python企业编码生成系统之系统主要函数设计详解
2019/07/26 Python
Python Django 实现简单注册功能过程详解
2019/07/29 Python
Django中自定义admin Xadmin的实现代码
2019/08/09 Python
用python绘制樱花树
2020/10/09 Python
Html5剪切板功能的实现代码
2018/06/29 HTML / CSS
策划创业计划书
2014/02/06 职场文书
小学国庆节活动总结
2015/03/23 职场文书
执行力心得体会范文
2016/01/11 职场文书
2019毕业典礼主持词!
2019/07/05 职场文书
2019新学期家长会工作计划
2019/08/21 职场文书