我是靠谱客的博主 无私路灯,最近开发中收集的这篇文章主要介绍Python伪私有属性总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

前言:在前面的博文里,我介绍了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的设计初衷相违背了,如果你要访问、修改,不妨通过getset方法,也就是我们之前说过的“函数封装”。

由此可见:Python的类并不存在正在的私有属性,通过双下划线实现的伪私有属性,本质上是对变量名进行压缩,使之无法直接在外部调用。

三、总结

Python中默认的成员函数,成员变量都是公开的(public),而且Python中没有类似publicprivate等关键词来修饰成员函数,成员变量。

在Python中定义私有变量只需要在变量名或函数名前加上“__”两个下划线,那么这个函数或变量就会为私有的了。

在内部,Python使用一种 name mangling 技术,将 __membername替换成 _classname__membername,所以你在外部使用原来的私有成员的名字时,会提示找不到。

命名混淆意在给出一个在类中定义“私有”实例变量和方法的简单途径, 避免派生类的实例变量定义产生问题,或者与外界代码中的变量搞混。 要注意的是混淆规则主要目的在于避免意外错误, 被认作为私有的变量仍然有可能被访问或修改。 在特定的场合它也是有用的,比如调试的时候, 这也是一直没有堵上这个漏洞的原因之一 (小漏洞:派生类和基类取相同的名字就可以使用基类的私有变量)。

最后

以上就是无私路灯为你收集整理的Python伪私有属性总结的全部内容,希望文章能够帮你解决Python伪私有属性总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部