浅谈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爬虫之使用urllib2组件抓取网页内容
Nov 04 Python
python 上下文管理器使用方法小结
Oct 10 Python
详解Python中如何写控制台进度条的整理
Mar 07 Python
python3实现磁盘空间监控
Jun 21 Python
Selenium定位元素操作示例
Aug 10 Python
Python查找数组中数值和下标相等的元素示例【二分查找】
Feb 13 Python
Python pip替换为阿里源的方法步骤
Jul 02 Python
Python实现列表中非负数保留,负数转化为指定的数值方式
Jun 04 Python
Python如何将将模块分割成多个文件
Aug 04 Python
Python .py生成.pyd文件并打包.exe 的注意事项说明
Mar 04 Python
pytorch 实现变分自动编码器的操作
May 24 Python
使用Django框架创建项目
Jun 10 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&amp;mysql(六)
2006/10/09 PHP
PHP实现模仿socket请求返回页面的方法
2014/11/04 PHP
判断用户是否在线的代码
2011/03/05 Javascript
通过jquery的$.getJSON做一个跨域ajax请求试验
2011/05/03 Javascript
javascript中的onkeyup和onkeydown区别介绍
2013/04/28 Javascript
JavaScript类属性的访问方式详解
2014/02/11 Javascript
如何解决hover在ie6中的兼容性问题
2016/12/15 Javascript
Angular2使用Augury来调试Angular2程序
2017/05/21 Javascript
基于Vue2.X的路由和钩子函数详解
2018/02/09 Javascript
vue组件实现进度条效果
2018/06/06 Javascript
react项目实践之webpack-dev-serve
2018/09/14 Javascript
详解Node.js中path模块的resolve()和join()方法的区别
2018/10/29 Javascript
JS实现简易贪吃蛇游戏
2020/08/24 Javascript
JavaScript实现鼠标移入随机变换颜色
2020/11/24 Javascript
[01:02:09]Liquid vs TNC 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21
2020/07/19 DOTA
python实现360皮肤按钮控件示例
2014/02/21 Python
Python中的条件判断语句基础学习教程
2016/02/07 Python
Python网络爬虫与信息提取(实例讲解)
2017/08/29 Python
浅谈Django中的数据库模型类-models.py(一对一的关系)
2018/05/30 Python
把csv文件转化为数组及数组的切片方法
2018/07/04 Python
pandas使用get_dummies进行one-hot编码的方法
2018/07/10 Python
Tensorflow使用支持向量机拟合线性回归
2018/09/07 Python
python 获取图片分辨率的方法
2019/01/08 Python
pytorch::Dataloader中的迭代器和生成器应用详解
2020/01/03 Python
CSS3实现线性渐变用法示例代码详解
2020/08/07 HTML / CSS
加拿大约会网站:EliteSingles.ca
2018/01/12 全球购物
行政部总经理岗位职责
2014/01/04 职场文书
演讲主持词
2014/03/18 职场文书
大学生社团活动总结
2014/04/26 职场文书
市场总监岗位职责
2015/02/11 职场文书
教师外出学习心得体会
2016/01/18 职场文书
正确使用MySQL INSERT INTO语句
2021/05/26 MySQL
带你了解CSS基础知识,样式
2021/07/21 HTML / CSS
Mysql排序的特性详情
2021/11/01 MySQL
关于PHP数组迭代器的使用方法实例
2021/11/17 PHP
python+pyhyper实现识别图片中的车牌号思路详解
2022/12/24 Python