浅谈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在windows和linux下获得本机本地ip地址方法小结
Mar 20 Python
Python base64编码解码实例
Jun 21 Python
将Python的Django框架与认证系统整合的方法
Jul 24 Python
Linux系统上Nginx+Python的web.py与Django框架环境
Dec 25 Python
python开发之list操作实例分析
Feb 22 Python
Python 装饰器实现DRY(不重复代码)原则
Mar 05 Python
Python json模块dumps、loads操作示例
Sep 06 Python
python批量修改图片后缀的方法(png到jpg)
Oct 25 Python
Python基于datetime或time模块分别获取当前时间戳的方法实例
Feb 19 Python
django 捕获异常和日志系统过程详解
Jul 18 Python
Django-xadmin后台导入json数据及后台显示信息图标和主题更改方式
Mar 11 Python
Pandas实现批量拆分与合并Excel的示例代码
May 30 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 daodb插入、更新与删除数据
2009/03/19 PHP
PHP中使用数组实现堆栈数据结构的代码
2012/02/05 PHP
PHP 基于Yii框架中使用smarty模板的方法详解
2013/06/13 PHP
PHP实现的增强性mhash函数
2015/05/27 PHP
PHP实现加密文本文件并限制特定页面的存取的效果
2016/10/21 PHP
PHP中类的自动加载的方法
2017/03/17 PHP
js变量以及其作用域详解
2020/07/18 Javascript
js 左右悬浮对联广告代码示例
2014/12/12 Javascript
jQuery使用append在html元素后同时添加多项内容的方法
2015/03/26 Javascript
jQuery超精致图片轮播幻灯片特效代码分享
2015/09/10 Javascript
jQuery实现鼠标经过事件的延时处理效果
2020/08/20 Javascript
jQuery实现的左右移动焦点图效果
2016/01/14 Javascript
如何制作幻灯片(代码分享)
2017/01/06 Javascript
canvas实现图片根据滑块放大缩小效果
2017/02/24 Javascript
javascript 中的try catch应用总结
2017/04/01 Javascript
jQuery手风琴的简单制作
2017/05/12 jQuery
20个最常见的jQuery面试问题及答案
2018/05/23 jQuery
bootstrap table实现iview固定列的效果实例代码详解
2019/09/30 Javascript
js实现数据导出为EXCEL(支持大量数据导出)
2020/03/31 Javascript
[55:16]Mski vs VGJ.S Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
python调用并链接MATLAB脚本详解
2019/07/05 Python
Python3运算符常见用法分析
2020/02/14 Python
python数字类型math库原理解析
2020/03/02 Python
The North Face北面美国官网:美国著名户外品牌
2018/09/15 全球购物
Manuka Doctor英国官网:真正的麦卢卡蜂蜜和护肤品
2018/10/26 全球购物
泰国最新活动和优惠:Megatix
2020/05/07 全球购物
放飞蜻蜓反思
2014/02/05 职场文书
眼镜促销方案
2014/03/15 职场文书
学习张丽丽心得体会
2014/09/03 职场文书
辞职书格式样本
2015/02/26 职场文书
煤矿百日安全活动总结
2015/05/07 职场文书
放牛班的春天观后感
2015/06/01 职场文书
冲出亚马逊观后感
2015/06/03 职场文书
八月一日观后感
2015/06/10 职场文书
一个家长教育孩子的心得体会
2016/01/15 职场文书
关于HTML编码导致的乱码问题
2021/09/04 HTML / CSS