python 面向对象 私有化浅析
· 前言
近几日,学校的python课程学到了面向对象这一块内容,在做作业的时候看到老师布置的内容有关于getters、setters两个方法的使用操作;可是老师既没讲清楚,度娘搜到的结果也模模糊糊,没有介绍清楚这一概念,看文章说是被@property 装饰器来替代了功能,以至于现在gettes、setters用法很少。(有兴趣可以参考文章为什么不需要为Python对象添加 getter 和 setter)本来我对面向对象的了解也不是太多,现在我整理一下学习思路。
·私有属性
Python的类里面默认的成员函数和成员变量都是公开的,Python 私有属性和方法没有类似别的语言的public,private等关键词来修饰。 在python中定义私有变量只需要在变量名或函数名前加上 "__"两个下划线,那么这个函数或变量就会为私有的了。
(python内最简单的一个类结构,包含公开变量和公开方法)
现在在__self__初始化函数内定义私有变量,无法在外部读取私有变量,会报错:没有 “__num” 属性。
·gettes、setters方法应用浅析:
定义getNum() 方式获取私有变量__num值,setNum()方式更新私有变量__num值。
class Test(object): def __init__(self): self.__num = 100 def getNum(self): return self.__num def setNum(self,value) self.__num = value t1 = Test() print(t1.getNum()) t1.setNum(200) print(t1.getNum())
·私有属性的其他一些骚操作
(1)新建一个py(soc.py)文件下面变量:
ipython3在同目录下打开,通过from xxx import *方式导入刚才的文件并尝试访问文件内的上述三个变量:
只有num1可以被访问到,后面的下划线开头的和下划线下划线开头的变量名称都不能被访问到。
可是如果用import XXX方式重新导入文件并访问却都可以做到:
(2)命名重整
以前面的文件test的Test类为例,__init__方法内定义了一个私有变量__num,实例无法直接访问到 ,根本原因其实是解释器给__num变量换了一个名字:
(顺便吹一波ipython工具的强大之处~~~)
在私有变量名称前面加上了'_类名',组成新的变量名称……_Test__num,可见python是很不期望实体能访问到根类的私有变量的,这对于保密性具有很强的现实意义。
·总结
变量名类似于
(1)xxx 公有变量
(2)_xxx 单前置下划线,不可被 from xx import * 外部文件引用,类对象和子类能访问
(3)__xxx 双前置下划线,避免与子类中变量名冲突,无法在外部直接访问(没职称证所以访问不到)
(4)__xxx__ 双前后置下划线,用户名字空间内置的魔法对象和方法,自己一般不要轻易定义