浅谈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字符串中查找子串小技巧
Apr 10 Python
Python中字符串的常见操作技巧总结
Jul 28 Python
python+matplotlib实现礼盒柱状图实例代码
Jan 16 Python
Python获取当前函数名称方法实例分享
Jan 18 Python
python使用PyQt5的简单方法
Feb 27 Python
详解python运行三种方式
May 13 Python
计算机二级python学习教程(1) 教大家如何学习python
May 16 Python
python ftplib模块使用代码实例
Dec 31 Python
pytorch 使用加载训练好的模型做inference
Feb 20 Python
给keras层命名,并提取中间层输出值,保存到文档的实例
May 23 Python
公认8个效率最高的爬虫框架
Jul 28 Python
Python基于Opencv识别两张相似图片
Apr 25 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
使用迭代器 遍历文件信息的详解
2013/06/08 PHP
解析php中的fopen()函数用打开文件模式说明
2013/06/20 PHP
php字符串截取的简单方法
2013/07/04 PHP
php的数组与字符串的转换函数整理汇总
2013/07/18 PHP
PHP生成唯一订单号的方法汇总
2015/04/16 PHP
PHP的Yii框架中过滤器相关的使用总结
2016/03/29 PHP
Laravel 微信小程序后端搭建步骤详解
2019/11/26 PHP
Javascript实例教程(19) 使用HoTMetal(5)
2006/12/23 Javascript
jQuery 核心函数以及jQuery对象
2010/03/23 Javascript
javascript学习笔记(二) js一些基本概念
2012/06/18 Javascript
jquery $(&quot;#variable&quot;) 循环改变variable的值示例
2014/02/23 Javascript
ie浏览器使用js导出网页到excel并打印
2014/03/11 Javascript
jquery鼠标放上去显示悬浮层即弹出定位的div层
2014/04/25 Javascript
nodejs实现获取当前url地址及url各种参数值
2015/06/25 NodeJs
AngularJS中监视Scope变量以及外部调用Scope方法
2016/01/23 Javascript
Javascript简写条件语句(推荐)
2016/06/12 Javascript
详解nodejs 文本操作模块-fs模块(二)
2016/12/22 NodeJs
vue移动UI框架滑动加载数据的方法
2018/03/12 Javascript
百度小程序之间的页面通信过程详解
2019/07/18 Javascript
用js限制网页只在微信浏览器中打开(或者只能手机端访问)
2020/12/24 Javascript
[00:35]可解锁地面特效
2018/12/20 DOTA
Python爬虫小技巧之伪造随机的User-Agent
2018/09/13 Python
python实现flappy bird小游戏
2018/12/24 Python
python递归法解决棋盘分割问题
2019/07/17 Python
python 矢量数据转栅格数据代码实例
2019/09/30 Python
中东地区最大的奢侈品市场:The Luxury Closet
2019/04/09 全球购物
澳大利亚家庭花园和DIY工具网店:VidaXL
2019/05/03 全球购物
印度第一网上礼品店:IGP.com
2020/02/06 全球购物
写求职信要注意什么问题
2014/04/12 职场文书
村级换届选举方案
2014/05/10 职场文书
公司联欢会策划方案
2014/05/19 职场文书
继承公证书格式
2015/01/26 职场文书
迎国庆主题班会
2015/08/17 职场文书
大队委员竞选演讲稿
2015/11/20 职场文书
vue cli4中mockjs在dev环境和build环境的配置详情
2022/04/06 Vue.js
python标准库ElementTree处理xml
2022/05/20 Python