浅谈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的Django框架中的静态资源管理器django-pipeline
Apr 25 Python
python实现带声音的摩斯码翻译实现方法
May 20 Python
Python解析并读取PDF文件内容的方法
May 08 Python
python 基本数据类型占用内存空间大小的实例
Jun 12 Python
python创建文件时去掉非法字符的方法
Oct 31 Python
python 利用文件锁单例执行脚本的方法
Feb 19 Python
Django Channels 实现点对点实时聊天和消息推送功能
Jul 17 Python
python中hasattr()、getattr()、setattr()函数的使用
Aug 16 Python
利用python、tensorflow、opencv、pyqt5实现人脸实时签到系统
Sep 25 Python
详解Python中字符串前“b”,“r”,“u”,“f”的作用
Dec 18 Python
Python生成器next方法和send方法区别详解
May 30 Python
Django程序的优化技巧
Apr 29 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
全国FM电台频率大全 - 7 吉林省
2020/03/11 无线电
PHP面向对象学习笔记之二 生成对象的设计模式
2012/10/06 PHP
PHP 基于Yii框架中使用smarty模板的方法详解
2013/06/13 PHP
php可应用于面包屑导航的迭代寻找家谱树实现方法
2015/02/02 PHP
php导出中文内容excel文件类实例
2015/07/06 PHP
Smarty保留变量用法分析
2016/05/23 PHP
JAVASCRIPT 对象的创建与使用
2021/03/09 Javascript
让人印象深刻的10个jQuery手风琴效果应用
2012/05/08 Javascript
正则表达式搭配js轻松处理json文本方便而老古
2013/02/17 Javascript
node.js中的console.dir方法使用说明
2014/12/10 Javascript
javaScript基础语法介绍
2015/02/28 Javascript
js上传图片及预览功能实例分析
2015/04/24 Javascript
nodejs实现获取某宝商品分类
2015/05/28 NodeJs
jQuery插件zepto.js简单实现tab切换
2015/06/16 Javascript
JavaScript编写连连看小游戏
2015/07/07 Javascript
jQuery实现点击小图片淡入淡出显示大图片特效
2015/09/09 Javascript
jQuery实现可展开折叠的导航效果示例
2016/09/12 Javascript
JS中定位 position 的使用实例代码
2017/08/06 Javascript
详解使用vue-admin-template的优化历程
2018/05/20 Javascript
bootstrap里bootstrap动态加载下拉框的实例讲解
2018/08/10 Javascript
Vue实现table上下移动功能示例
2019/02/21 Javascript
js实现旋转的星空效果
2019/11/01 Javascript
使用PyCharm配合部署Python的Django框架的配置纪实
2015/11/19 Python
在Python中移动目录结构的方法
2016/01/31 Python
Tornado Web Server框架编写简易Python服务器
2018/07/28 Python
Python中作用域的深入讲解
2018/12/10 Python
Python解决线性代数问题之矩阵的初等变换方法
2018/12/12 Python
python使用插值法画出平滑曲线
2018/12/15 Python
Django框架用户注销功能实现方法分析
2019/05/28 Python
使用Django实现把两个模型类的数据聚合在一起
2020/03/28 Python
精灵市场:Pixie Market
2019/06/18 全球购物
Python文件操作的面试题
2013/06/22 面试题
行政部经理助理岗位职责
2014/06/15 职场文书
2015年大学生工作总结
2015/04/21 职场文书
《圆的面积》教学反思
2016/02/19 职场文书
Ajax是什么?Ajax高级用法之Axios技术
2021/04/21 Javascript