python 私有函数、专有方法
私有和专有
在任何语言中,都会规定某些对象(属性、方法、函数、类等)只能够在某个范围内访问,出了这个范围就不能访问了。这是“公”、“私”之分。此外,还会专门为某些特殊的东西指定一些特殊表示,比如类的名字就不能用class,def等,这就是保留字。除了保留字,python中还为类的名字做了某些特殊准备,就是“专有”的范畴。
私有函数
在某些时候,会看到有一种方法命名比较特别,是以“__”双划线开头的,将这类命名的函数/方法称之为“私有函数”。
所谓私有函数,就是:
私有函数不可以从它们的模块外面被调用
私有类方法不能够从它们的类外面被调用
私有属性不能够从它们的类外面被访问
跟私有对应的,就是所谓的公有啦。有的编程语言用特殊的关键词来说明某函数或方法或类是私有还是公有。但是python仅仅用名字来说明。
如果一个 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__'用的比较多,所以前面很多例子都是它。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
python 模块的加载
不管是用import还是用from mmmm import *的方式导入模块,当程序运行之后,回头在看那个存储着mmmm.py文件的目录中,多了一个文件: $ ls mmm* mmmm.py mmmm.pyc 在这个目录下面,除了原来的那个mmmm.py之外,又多了一个mmmm.pyc文件,这个文件不是我写的,需要用import的过程说起。 import的工作流程 import mmmm,并不是仅仅将mmmm.py这个文件装载到当前位置(文件内),其实是首先进行了一次运算。当mmmm.py被第一次导入的时候,python首先要对其进行编译,生成扩展名为.pyc的同名文件,然后才执行mmmm模块的代码,创建相应的对象等。就如同把大象装进冰箱,有三步要执行: 搜索。就是python要能够找到import的模块。怎么找到,后面讲述。 编译。找到模块文件之后,将其编译成字节码,就是那个.pyc文件里面的(关于字节码,下面会介绍,请继续阅读)。注意,不是什么时候都编译的,只有第一次运行时候才编译,如果mmmm.py文件改变了,相当于又一个新文件,也会从新编译。其实就是.pyc文件中有一个时间戳,...
- 下一篇
Django使用数据库(Mariadb/Mysql)
Django默认使用SQLite作为数据库,配置文件在settings.py 让我们来看一下 """ Django settings for test1 project. Generated by 'django-admin startproject' using Django 2.1.4. For more information on this file, see https://docs.djangoproject.com/en/2.1/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/2.1/ref/settings/ """ import os # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))...
相关文章
文章评论
共有0条评论来说两句吧...