概述
前言:在前面的博文里,我介绍了Python中的面向对象,详情见:深入浅出Python——Python高级语法之面向对象,本文将主要讲解Python中的伪私有属性。
文章目录
- 一、引言
- 二、实例
- 1. 代码
- 2. 执行
- 3. 分析
- 4. 测试
- 5. 反思
- 三、总结
一、引言
我们都知道:在Python中,没有类似private
之类的关键字来声明私有方法或属性。
Python中要声明私有属性,需要在属性前加上双下划线(但是结尾处不能有双下划线),如:self.__a
。然而这样的什么方式并不是真正的私有,而是“伪私有”。
Python的伪私有属性,实际是通过变量名压缩(mangling)来实现变量名局部化。变量名压缩的规则:在初始的变量名头部加上一个下划线,再加上类的名称,最后是初始变量名的名称。
二、实例
1. 代码
class A(object):
# 私有类属性
__flag = 0
# 私有实例方法
def __func(self):
print("ok")
print(A.__dict__)
2. 执行
{'__module__': '__main__', '_A__flag': 0, '_A__func': <function A.__func at 0x000002422B7789D0>, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}
3. 分析
通过上面的执行效果,我们可以看到:我们在类里面创建了一个私有类属性(__flag)、一个私有实例方法(__func),而我们在打印__dict__
的时候发现——私有属性、私有方法的名字变了!此时显示:私有类属性(_A__flag)、私有实例方法(_A__func),这是为什么呢?
之前我们说过:Python没有类似private
之类的关键字来声明私有方法或属性,那么它是靠什么来区分私有、公有呢?靠的就是在属性前加上双下划线,此时我们的Python解释器在执行到这里的时候,发现了这个__
。此时它会耍一个“小聪明”,也就是根据我们之前说的变量名压缩(mangling),给这个属性、方法换一个变量名进行存储。那么此时,就可以实现私有化了。
4. 测试
那么现在,我们去访问一下我们创建的类属性、实例方法,看一下效果:
a = A()
print(a.flag)
a.func()
print(a.__flag)
a.__func()
# AttributeError: 'A' object has no attribute 'flag'
那么我们之所以说它是“伪私有”,是因为在了解伪私有变量的变量名压缩规则后,可以根据压缩规则进行调用。此时,我们再去访问一下更名后的名字,看一下效果:
print(a._A__flag)
a._A__func()
# 0
# ok
此时,我们可以看到:成功的进行访问了。
5. 反思
通过上面的演示,我们可以看出:私有其实就是我们的Python解释器给其换了一个名字。那么此时,你再去访问它之前的名字,肯定是访问不到的,这个很好理解。
此时,我也不建议你去通过我们上面的这种方法去访问。因为这样,就与Python的设计初衷相违背了,如果你要访问、修改,不妨通过get
、set
方法,也就是我们之前说过的“函数封装”。
由此可见:Python的类并不存在正在的私有属性,通过双下划线实现的伪私有属性,本质上是对变量名进行压缩,使之无法直接在外部调用。
三、总结
Python中默认的成员函数,成员变量都是公开的(public),而且Python中没有类似public
、private
等关键词来修饰成员函数,成员变量。
在Python中定义私有变量只需要在变量名或函数名前加上“__
”两个下划线,那么这个函数或变量就会为私有的了。
在内部,Python使用一种 name mangling 技术,将 __membername替换成 _classname__membername,所以你在外部使用原来的私有成员的名字时,会提示找不到。
命名混淆意在给出一个在类中定义“私有”实例变量和方法的简单途径, 避免派生类的实例变量定义产生问题,或者与外界代码中的变量搞混。 要注意的是混淆规则主要目的在于避免意外错误, 被认作为私有的变量仍然有可能被访问或修改。 在特定的场合它也是有用的,比如调试的时候, 这也是一直没有堵上这个漏洞的原因之一 (小漏洞:派生类和基类取相同的名字就可以使用基类的私有变量)。
最后
以上就是无私路灯为你收集整理的Python伪私有属性总结的全部内容,希望文章能够帮你解决Python伪私有属性总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复