跟老齐学Python之私有函数和专有方法


Posted in Python onOctober 24, 2014

在任何语言中,都会规定某些对象(属性、方法、函数、类等)只能够在某个范围内访问,出了这个范围就不能访问了。这是“公”、“私”之分。此外,还会专门为某些特殊的东西指定一些特殊表示,比如类的名字就不能用class,def等,这就是保留字。除了保留字,python中还为类的名字做了某些特殊准备,就是“专有”的范畴。

私有函数

在某些时候,会看到有一种方法命名比较特别,是以“__”双划线开头的,将这类命名的函数/方法称之为“私有函数”。

所谓私有函数,就是:

私有函数不可以从它们的模块外面被调用
私有类方法不能够从它们的类外面被调用
私有属性不能够从它们的类外面被访问
跟私有对应的,就是所谓的公有啦。有的编程语言用特殊的关键词来说明某函数或方法或类是私有还是公有。但是python仅仅用名字来说明,因为python深刻理解了2k年前孔先生丘所说的“名不正言不顺”的含义。

如果一个 Python 函数,类方法,或属性的名字以两个下划线开始 (但不是结束),它是私有的;其它所有的都是公有的。类方法或者是私有 (只能在它们自已的类中使用) 或者是公有 (任何地方都可使用)。例如:

class Person:

def __init__(self,name):

    self.name = name
def __work(self,salary):

    print "%s salary is:%d"%(self.name,salary)

这里边定义的方法__work()就是一个私有方法。

下面把上面的类进行完善,然后运行,通过实例来调用这个私有方法

#!/usr/bin/env python

#coding:utf-8
class Person:

    def __init__(self,name):

        self.name = name

        print self.name
    def __work(self,salary):

        print "%s salary is: %d"%(self.name,salary)
if __name__=="__main__":

    officer = Person("Tom")

    officer.__work(1000)
#运行结果
Tom

Traceback (most recent call last):

  File "225.py", line 14, in <module>

    officer.__work(1000)

AttributeError: Person instance has no attribute '__work'

从运行结果中可以看出,当运行到officer.__work(1000)的时候,报错了。并且从报错信息中说,没有该方法。这说明,这个私有方法,无法在类意外调用(其实类意外可以调用私有方法,就是太麻烦,况且也不提倡,故本教程滤去)。

下面将上述代码进行修改,成为:

#!/usr/bin/env python

#coding:utf-8
class Person:

    def __init__(self,name):

        self.name = name

        print self.name
    def __work(self,salary):

        print "%s salary is: %d"%(self.name,salary)
    def worker(self):

        self.__work(500)        #在类内部调用私有方法
if __name__=="__main__":

    officer = Person("Tom")

    #officer.__work(1000)

    officer.worker()
#运行结果
Tom

Tom salary is: 500

结果正是要得到的。看官是否理解私有方法的用法了呢?

专有方法

如果是以双划线开头,但不是以它结尾,所命名的方法是私有方法;

如果以双划线开头,并且以双划线结尾,所命名的方法就是专有方法。

这是python规定的。所以在写程序的时候要执行,不执行就是跟python过不去,过不去就报错了。

比如前面反复提到的__init__(),就是一个典型的专有方法。那么自己在写别的方法时,就不要用__开头和结尾了。虽然用了也大概没有什么影响,但是在可读性上就差很多了,一段程序如果可读性不好,用不了多长时间自己就看不懂了,更何况别人呢?

关于专有方法,出了__init__()之外,还有诸如:__str__,__setitem__等等,要向看,可以利用dir()函数在交互模式下看看某个函数里面的专有东西。当然,也可以自己定义啦。

因为__init__用的比较多,所以前面很多例子都是它。

Python 相关文章推荐
windows下python连接oracle数据库
Jun 07 Python
浅谈Pandas:Series和DataFrame间的算术元素
Dec 22 Python
Python数据类型之Tuple元组实例详解
May 08 Python
Python实现代码统计工具
Sep 19 Python
python 调试冷知识(小结)
Nov 11 Python
python如何使用jt400.jar包代码实例
Dec 20 Python
找Python安装目录,设置环境路径以及在命令行运行python脚本实例
Mar 09 Python
Django+python服务器部署与环境部署教程详解
Mar 30 Python
opencv+python实现鼠标点击图像,输出该点的RGB和HSV值
Jun 02 Python
Python3 用matplotlib绘制sigmoid函数的案例
Dec 11 Python
装上这 14 个插件后,PyCharm 真的是无敌的存在
Jan 11 Python
一篇文章带你了解Python和Java的正则表达式对比
Sep 15 Python
跟老齐学Python之模块的加载
Oct 24 #Python
python和shell实现的校验IP地址合法性脚本分享
Oct 23 #Python
探寻python多线程ctrl+c退出问题解决方案
Oct 23 #Python
纯Python开发的nosql数据库CodernityDB介绍和使用实例
Oct 23 #Python
Python中使用scapy模拟数据包实现arp攻击、dns放大攻击例子
Oct 23 #Python
使用Python开发windows GUI程序入门实例
Oct 23 #Python
手动实现把python项目发布为exe可执行程序过程分享
Oct 23 #Python
You might like
PHP开发微信支付的代码分享
2014/05/25 PHP
php实现将base64格式图片保存在指定目录的方法
2016/10/13 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
一个js封装的不错的选项卡效果代码
2008/02/15 Javascript
javascript 动态加载 css 方法总结
2009/07/11 Javascript
JQuery 表格操作(交替显示、拖动表格行、选择行等)
2009/07/29 Javascript
js操作ajax返回的json的注意问题!
2010/02/23 Javascript
JQuery的Validation插件中Remote验证的中文问题
2010/07/26 Javascript
纯JS实现根据CSS的class选择DOM
2014/03/22 Javascript
2014最热门的JavaScript代码高亮插件推荐
2014/11/25 Javascript
javascript正则表达式中的replace方法详解
2015/04/20 Javascript
JavaScript基本的输出和嵌入式写法教程
2015/10/20 Javascript
Laravel中常见的错误与解决方法小结
2016/08/30 Javascript
Angular路由简单学习
2016/12/26 Javascript
JS实现的自动打字效果示例
2017/03/10 Javascript
JS 中使用Promise 实现红绿灯实例代码(demo)
2017/10/20 Javascript
JavaScript基础心法 深浅拷贝(浅拷贝和深拷贝)
2018/03/05 Javascript
vue中render函数的使用详解
2018/10/12 Javascript
微信小程序外卖选购页实现切换分类与数量加减功能案例
2019/01/15 Javascript
layui自定义工具栏的方法
2019/09/19 Javascript
[01:07:21]NAVI vs VG Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
[55:18]Liquid vs Chaos 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
使用 Python 实现微信公众号粉丝迁移流程
2018/01/03 Python
Python中IP地址处理IPy模块的方法
2019/08/16 Python
TensorFlow设置日志级别的几种方式小结
2020/02/04 Python
Django实现将views.py中的数据传递到前端html页面,并展示
2020/03/16 Python
python快速安装OpenCV的步骤记录
2021/02/22 Python
HTML5实现移动端点击翻牌功能
2020/10/23 HTML / CSS
Spartoo英国:欧洲最大的网上鞋店
2016/09/13 全球购物
奥地利票务门户网站:oeticket.com
2019/12/31 全球购物
Napapijri西班牙在线商店:夹克、外套、运动衫等
2020/11/05 全球购物
白酒营销策划方案
2014/08/17 职场文书
2014年禁毒工作总结
2014/11/24 职场文书
CSS3 制作的书本翻页特效
2021/04/13 HTML / CSS
基于python的matplotlib制作双Y轴图
2021/04/20 Python
MySQL数据库如何查看表占用空间大小
2022/06/10 MySQL