跟老齐学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实现的矩阵类实例
Aug 22 Python
tensorflow 获取模型所有参数总和数量的方法
Jun 14 Python
详解利用django中间件django.middleware.csrf.CsrfViewMiddleware防止csrf攻击
Oct 09 Python
python3.4+pycharm 环境安装及使用方法
Jun 13 Python
Python函数中参数是传递值还是引用详解
Jul 02 Python
如何使用Python多线程测试并发漏洞
Dec 18 Python
python获取网络图片方法及整理过程详解
Dec 20 Python
python 解决flask uwsgi 获取不到全局变量的问题
Dec 22 Python
Django更新models数据库结构步骤
Apr 01 Python
在python中修改.properties文件的操作
Apr 08 Python
解决Ubuntu18中的pycharm不能调用tensorflow-gpu的问题
Sep 17 Python
Django 实现jwt认证的示例
Apr 30 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
快速配置PHPMyAdmin方法
2008/06/05 PHP
PHP中explode函数和split函数的区别小结
2016/08/24 PHP
thinkPHP内置字符串截取函数用法详解
2016/11/15 PHP
Laravel中的Auth模块详解
2017/08/17 PHP
PHP连接MySQL数据库三种实现方法
2020/12/10 PHP
javascript ie6兼容position:fixed实现思路
2013/04/01 Javascript
Node.js模拟浏览器文件上传示例
2014/03/26 Javascript
JQuery Mobile实现导航栏和页脚
2016/03/09 Javascript
js仿搜狐视频记录片列表展示效果
2020/05/30 Javascript
vue中如何实现变量和字符串拼接
2017/06/19 Javascript
JS实现浏览上传文件的代码
2017/08/23 Javascript
详解使用PM2管理nodejs进程
2017/10/24 NodeJs
详解自定义ajax支持跨域组件封装
2018/02/08 Javascript
浅谈微信小程序flex布局基础
2018/09/10 Javascript
nodejs中实现修改用户路由功能
2019/05/24 NodeJs
vue中node_modules中第三方模块的修改使用详解
2019/05/31 Javascript
基于javascript实现放大镜特效
2020/12/03 Javascript
在Python的Django框架上部署ORM库的教程
2015/04/20 Python
Python入门之modf()方法的使用
2015/05/15 Python
Python3实现从指定路径查找文件的方法
2015/05/22 Python
Python多进程并发(multiprocessing)用法实例详解
2015/06/02 Python
通过python调用adb命令对App进行性能测试方式
2020/04/23 Python
python中pandas库中DataFrame对行和列的操作使用方法示例
2020/06/14 Python
python不同版本的_new_不同点总结
2020/12/09 Python
Python读取ini配置文件传参的简单示例
2021/01/05 Python
python 利用panda 实现列联表(交叉表)
2021/02/06 Python
html5 css3实例教程 一款html5和css3实现的小机器人走路动画
2014/10/20 HTML / CSS
中国综合网上购物商城:苏宁易购
2016/08/09 全球购物
工程管理专业个人求职信范文
2013/12/07 职场文书
营销人才自我鉴定范文
2013/12/25 职场文书
高中毕业生登记表自我鉴定范文
2014/03/18 职场文书
opencv-python图像配准(匹配和叠加)的实现
2021/06/23 Python
Java比较两个对象中全部属性值是否相等的方法
2021/08/07 Java/Android
React Fragment介绍与使用详解
2021/11/11 Javascript
配置Kubernetes外网访问集群
2022/03/31 Servers
使用ICOM IC-R9500接收机同时测评十台收音机中波接收性能
2022/05/10 无线电