跟老齐学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 相关文章推荐
python实现文件分组复制到不同目录的例子
Jun 04 Python
浅谈MySQL中的触发器
May 05 Python
Python中最大最小赋值小技巧(分享)
Dec 23 Python
python使用tensorflow保存、加载和使用模型的方法
Jan 31 Python
python中numpy的矩阵、多维数组的用法
Feb 05 Python
numpy找出array中的最大值,最小值实例
Apr 03 Python
java中两个byte数组实现合并的示例
May 09 Python
python散点图实例之随机漫步
Aug 27 Python
Face++ API实现手势识别系统设计
Nov 21 Python
python脚本开机自启的实现方法
Jun 28 Python
win10安装python3.6的常见问题
Jul 01 Python
python 星号(*)的多种用途
Sep 21 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
将OICQ数据转成MYSQL数据
2006/10/09 PHP
PHP获取当前日期所在星期(月份)的开始日期与结束日期(实现代码)
2013/06/18 PHP
PHP自定义函数实现格式化秒的方法
2016/09/14 PHP
Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法
2018/08/16 PHP
JavaScript 类型的包装对象(Typed Wrappers)
2011/10/27 Javascript
JS字符串处理实例代码
2013/08/05 Javascript
js面向对象之公有、私有、静态属性和方法详解
2015/04/17 Javascript
javascript bom是什么及bom和dom的区别
2015/11/26 Javascript
分享JavaScript与Java中MD5使用两个例子
2015/12/23 Javascript
Flask中获取小程序Request数据的两种方法
2017/05/12 Javascript
详解如何优雅地在React项目中使用Redux
2017/12/28 Javascript
Vuejs+vue-router打包+Nginx配置的实例
2018/09/20 Javascript
js微信分享接口调用详解
2019/07/23 Javascript
[01:04:05]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python编程入门的一些基本知识
2015/05/13 Python
Windows下Python2与Python3两个版本共存的方法详解
2017/02/12 Python
python3中int(整型)的使用教程
2017/03/23 Python
Django中数据库的数据关系:一对一,一对多,多对多
2018/10/21 Python
python抖音表白程序源代码
2019/04/07 Python
Python面向对象程序设计之私有属性及私有方法示例
2019/04/08 Python
python中时间模块的基本使用教程
2019/05/14 Python
Pycharm新建模板默认添加个人信息的实例
2019/07/15 Python
python并发编程多进程 互斥锁原理解析
2019/08/20 Python
Python基于execjs运行js过程解析
2020/11/27 Python
Python的信号库Blinker用法详解
2020/12/31 Python
java关于string最常出现的面试题整理
2021/01/18 Python
css3 实现滚动条美化效果的实例代码
2021/01/06 HTML / CSS
中国高端鲜花第一品牌:roseonly(一生只送一人)
2017/02/12 全球购物
英国领先的狗和宠物美容专家:Christies Direct
2017/04/03 全球购物
《玩具柜台前的孩子》教学反思
2014/02/13 职场文书
4S店售后客服自我评价
2014/04/09 职场文书
关于保护环境的建议书
2014/05/13 职场文书
2014年度培训工作总结
2014/11/27 职场文书
优秀学生主要事迹怎么写
2015/11/04 职场文书
浅谈Java父子类加载顺序
2021/08/04 Java/Android
js不常见操作运算符总结
2021/11/20 Javascript