浅谈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 ftp上传文件
Feb 13 Python
Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法
Apr 22 Python
Python使用matplotlib绘制三维图形示例
Aug 25 Python
Python应用领域和就业形势分析总结
May 14 Python
Python matplotlib生成图片背景透明的示例代码
Aug 30 Python
python [:3] 实现提取数组中的数
Nov 27 Python
pytorch使用tensorboardX进行loss可视化实例
Feb 24 Python
python GUI库图形界面开发之PyQt5单选按钮控件QRadioButton详细使用方法与实例
Feb 28 Python
如何在Windows中安装多个python解释器
Jun 16 Python
Python requests及aiohttp速度对比代码实例
Jul 16 Python
Python实现EM算法实例代码
Oct 04 Python
pytorch中的numel函数用法说明
May 13 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 分页类实现代码
2009/12/03 PHP
php利用cookie实现自动登录的方法
2014/12/10 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
2018/05/23 PHP
PHP利用百度ai实现文本和图片审核
2019/05/08 PHP
js自定义事件及事件交互原理概述(二)
2013/02/01 Javascript
javascript学习笔记--数字格式类型
2014/05/22 Javascript
jQuery选择器源码解读(三):tokenize方法
2015/03/31 Javascript
jQuery简单实现遍历数组的方法
2015/04/14 Javascript
js简单实现竖向tab选项卡的方法
2015/05/04 Javascript
jquery实现的V字形显示效果代码
2015/10/27 Javascript
常见JS验证脚本汇总
2015/12/01 Javascript
全国省市二级联动下拉菜单 js版
2016/05/10 Javascript
深入理解JavaScript中的浮点数
2016/05/18 Javascript
javascript实现随机生成DIV背景色
2016/06/20 Javascript
Boostrap基础教程之JavaScript插件篇
2016/09/08 Javascript
Vue.js使用$.ajax和vue-resource实现OAuth的注册、登录、注销和API调用
2017/05/10 Javascript
javascript代码优化的8点总结
2018/01/29 Javascript
jQuery实现带右侧索引功能的通讯录示例【附源码下载】
2018/04/17 jQuery
AngularJS中的作用域实例分析
2018/05/16 Javascript
基于JavaScript实现每日签到打卡轨迹功能
2018/11/29 Javascript
javascript面向对象三大特征之封装实例详解
2019/07/24 Javascript
Python实现PS图像明亮度调整效果示例
2018/01/23 Python
Python基于多线程实现ping扫描功能示例
2018/07/23 Python
python实现网页自动签到功能
2019/01/21 Python
在win10和linux上分别安装Python虚拟环境的方法步骤
2019/05/09 Python
10个Python面试常问的问题(小结)
2019/11/20 Python
Python基于Faker假数据构造库
2020/11/30 Python
HTML5高仿微信聊天、微信聊天表情|对话框|编辑器功能
2018/04/23 HTML / CSS
大四优秀党员个人民主评议
2014/09/19 职场文书
乡镇干部个人对照检查材料思想汇报
2014/10/04 职场文书
2014年营业员工作总结
2014/11/18 职场文书
2014年卫生院工作总结
2014/12/03 职场文书
大学生年度个人总结
2015/02/15 职场文书
2016大学生求职自荐信范文
2016/01/28 职场文书
如何获取numpy array前N个最大值
2021/05/14 Python
Redis入门教程详解
2021/08/30 Redis