浅谈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中处理字符串之endswith()方法的使用简介
May 18 Python
Django Admin实现上传图片校验功能
Mar 06 Python
Python 比较两个数组的元素的异同方法
Aug 17 Python
python字典操作实例详解
Nov 16 Python
python处理大日志文件
Jul 23 Python
关于tensorflow的几种参数初始化方法小结
Jan 04 Python
python识别验证码图片实例详解
Feb 17 Python
Python通过正则库爬取淘宝商品信息代码实例
Mar 02 Python
python seaborn heatmap可视化相关性矩阵实例
Jun 03 Python
Flask中sqlalchemy模块的实例用法
Aug 02 Python
Python中使用ipython的详细教程
Jun 22 Python
分享Python获取本机IP地址的几种方法
Mar 17 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数组函数array_push()、array_pop()及array_shift()简单用法示例
2020/01/26 PHP
JavaScript中的对象化编程
2008/01/16 Javascript
JQueryEasyUI datagrid框架的进阶使用
2013/04/08 Javascript
JavaScript 面向对象与原型
2015/04/10 Javascript
跟我学习javascript的最新标准ES6
2015/11/20 Javascript
巧用Vue.js+Vuex制作专门收藏微信公众号的app
2016/11/03 Javascript
正则验证小数点后面只能有两位数的方法
2017/02/28 Javascript
Ionic项目中Native Camera的使用方法
2017/06/07 Javascript
Angularjs中数据绑定的实例详解
2017/08/25 Javascript
Vue 中批量下载文件并打包的示例代码
2017/11/20 Javascript
mui back 返回刷新页面的实例
2017/12/06 Javascript
使用socket.io制做简易WEB聊天室
2018/01/02 Javascript
nodejs中密码加密处理操作详解
2018/03/20 NodeJs
vue-image-crop基于Vue的移动端图片裁剪组件示例
2018/08/28 Javascript
Vue中实现权限控制的方法示例
2019/06/07 Javascript
原生js添加一个或多个类名的方法分析
2019/07/30 Javascript
微信小程序后端(java)开发流程的详细步骤
2019/11/13 Javascript
JavaScript设计模式---单例模式详解【四种基本形式】
2020/05/16 Javascript
vue使用swiper实现左右滑动切换图片
2020/10/16 Javascript
[44:47]Ti4 循环赛第三日 iG vs NaVi
2014/07/12 DOTA
[02:38]DOTA2亚洲邀请赛 IG战队巡礼
2015/02/03 DOTA
[01:01:43]EG vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
用Django写天气预报查询网站
2018/10/21 Python
Django如何开发简单的查询接口详解
2019/05/17 Python
python实现两张图片拼接为一张图片并保存
2019/07/16 Python
Python交互环境下打印和输入函数的实例内容
2020/02/16 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
2020/08/05 Python
悬挂训练绳:TRX
2017/12/14 全球购物
尤妮佳moony海外旗舰店:日本殿堂级纸尿裤品牌
2018/02/23 全球购物
三查三看党性分析材料
2014/02/18 职场文书
教师求职自荐书
2014/06/14 职场文书
班组长安全工作职责
2014/07/15 职场文书
司法工作人员群众路线对照检查材料思想汇报
2014/09/30 职场文书
布达拉宫的导游词
2015/02/02 职场文书
决心书格式及范文
2019/06/24 职场文书
实战 快速定位MySQL的慢SQL
2022/03/22 MySQL