跟老齐学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 相关文章推荐
探索Python3.4中新引入的asyncio模块
Apr 08 Python
python中的代码编码格式转换问题
Jun 10 Python
python判断字符串编码的简单实现方法(使用chardet)
Jul 01 Python
python使用锁访问共享变量实例解析
Feb 08 Python
python 显示数组全部元素的方法
Apr 19 Python
Python + selenium自动化环境搭建的完整步骤
May 19 Python
pandas中apply和transform方法的性能比较及区别介绍
Oct 30 Python
centos 安装Python3 及对应的pip教程详解
Jun 28 Python
Python环境Pillow( PIL )图像处理工具使用解析
Sep 12 Python
Python os模块常用方法和属性总结
Feb 20 Python
Python用户自定义异常的实现
Dec 25 Python
Python实现提取PDF简历信息并存入Excel
Apr 02 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/02/28 PHP
PHP中使用glob函数实现一句话删除某个目录下的所有文件
2014/07/22 PHP
PHP的serialize序列化数据以及JSON格式化数据分析
2015/10/10 PHP
Laravel中前端js上传图片到七牛云的示例代码
2017/09/04 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
php微信公众号开发之图片回复
2018/10/20 PHP
推荐dojo学习笔记
2007/03/24 Javascript
ECMAScript 基础知识
2007/06/29 Javascript
event.keyCode键码值表 附只能输入特定的字符串代码
2009/05/15 Javascript
JS仿flash上传头像效果实现代码
2011/07/18 Javascript
javascript实现window.print()去除页眉页脚
2014/12/30 Javascript
jquery实现点击向下展开菜单项(伸缩导航)效果
2015/08/22 Javascript
Bootstrap自定义文件上传下载样式
2016/05/26 Javascript
JS模仿腾讯图片站的图片翻页按钮效果完整实例
2016/06/21 Javascript
详解在Angularjs中ui-sref和$state.go如何传递参数
2017/04/24 Javascript
react-router实现跳转传值的方法示例
2017/05/27 Javascript
详解从零搭建 vue2 vue-router2 webpack3 工程
2017/11/22 Javascript
详解Vue 匿名、具名和作用域插槽的使用方法
2019/04/22 Javascript
在vue中阻止浏览器后退的实例
2019/11/06 Javascript
Javascript ParentNode和ChildNode接口原理解析
2020/03/16 Javascript
Javascript实现打鼓效果
2021/01/29 Javascript
[01:02:34]TFT vs VGJ.T Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
简介Python设计模式中的代理模式与模板方法模式编程
2016/02/02 Python
Python安装pycurl失败的解决方法
2018/10/15 Python
python生成九宫格图片
2018/11/19 Python
python的继承知识点总结
2018/12/10 Python
pytorch中tensor张量数据类型的转化方式
2019/12/31 Python
将数据集制作成VOC数据集格式的实例
2020/02/17 Python
python爬虫数据保存到mongoDB的实例方法
2020/07/28 Python
python读写数据读写csv文件(pandas用法)
2020/12/14 Python
Funko官方商店:源自美国,畅销全球搪胶收藏玩偶
2018/09/15 全球购物
教师年终个人自我评价
2013/10/04 职场文书
教育系毕业生中文求职信范文
2013/10/06 职场文书
关于廉洁的广播稿
2014/01/30 职场文书
企业办公室主任岗位职责
2015/04/01 职场文书
十个Python自动化常用操作,即拿即用
2021/05/10 Python