事实上,Python 封装特性的实现纯属“投机取巧”,之所以类对象无法直接调用以双下划线开头命名的类属性和类方法,是因为其底层实现时,Python 偷偷改变了它们的名称。

前面章节中,我们定义了一个 CLanguage 类,定义如下:

class CLanguage :

def setname(self, name):

if len(name) < 3:

raise ValueError('名称长度必须大于3!')

self.__name = name

def getname(self):

return self.__name

#为 name 配置 setter 和 getter 方法

name = property(getname, setname)

def setadd(self, add):

if add.startswith("http://"):

self.__add = add

else:

raise ValueError('地址必须以 http:// 开头')

def getadd(self):

return self.__add

#为 add 配置 setter 和 getter 方法

add = property(getadd, setadd)

#定义个私有方法

def __display(self):

print(self.__name,self.__add)

注意,在这个类中,有一个 __display() 方法,由于其是私有方法,且该类没有提供任何调用该方法的“接口”,因此在目前看来,此方法根本无法在类外部调用。也就是说,如下调用 __display() 方法是不可行的:

clang = CLanguage()

#尝试调用私有的 display() 方法

clang.__display()

这会导致如下错误:

Traceback (most recent call last):

File "D:\python3.6\1.py", line 33, in

clang.__display()

AttributeError: 'CLanguage' object has no attribute '__display'

那么,是不是类似 display() 这种的私有方法,真的没有方法调用吗?如果你深入了解 Python 封装机制的底层实现原理,就可以调用它。

事实上,对于以双下划线开头命名的类属性或类方法,Python 在底层实现时,将它们的名称都偷偷改成了 "_类名__属性(方法)名" 的格式。

就以 CLanguage 类中的 __display() 为例,Python 在底层将其方法名偷偷改成了“_CLanguage__display()”。例如,在 CLanguage 类的基础上,执行如下代码:

clang = CLanguage()

#调用name的setname()方法

clang.name = "C语言中文网"

#调用add的setadd()方法

clang.add = "http://c.biancheng.net"

#直接调用隐藏的display()方法

clang._CLanguage__display()

输出结果为:

C语言中文网 http://c.biancheng.net

不仅如此,那些原本我们认为是私有的类属性(例如 __name 和 __add),其底层的名称也改成了“_类名__属性名”的这种格式。例如:

clang = CLanguage()

clang.name = "C语言中文网"

clang.add = "http://c.biancheng.net"

#直接调用 name 和 add 私有属性

print(clang._CLanguage__name,clang._CLanguage__add)

运行结果为:

C语言中文网 http://c.biancheng.net

甚至于,我们还可以通过这种方式修改 clang 对象的私有属性,例如:

clang._CLanguage__name = "Python教程"

clang._CLanguage__add = "http://c.biancheng.net/python"

print(clang._CLanguage__name,clang._CLanguage__add)

输出结果为:

Python教程 http://c.biancheng.net/python

总结

Python 类中所有的属性和方法,都是公有(public)属性,如果希望 Python 底层修改类属性或者类方法的名称,以此将它们隐藏起来,只需将它们的名称前添加双下划线(“__”)即可。

python的底层实现,Python封装底层实现原理详解(通俗易懂)相关推荐

  1. python一行代码完成正态分布检验,附原理详解

    在进行数据分析处理的过程中,经常需要判断数据是否符合正太分布,正常的正太分布检验费时费力,本文介绍如何通过python快速实现对正太分布的检验: 前方高能!!!看如何一行代码实现数据的正太分布检验 f ...

  2. python函数定义及调用-python函数声明和调用定义及原理详解

    这篇文章主要介绍了python函数声明和调用定义及原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 函数是指代码片段,可以重复调用,比如我们前 ...

  3. python函数声明和调用定义及原理详解

    这篇文章主要介绍了python函数声明和调用定义及原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 函数是指代码片段,可以重复调用,比如我们前 ...

  4. 视频教程-深度学习原理详解及Python代码实现-深度学习

    深度学习原理详解及Python代码实现 大学教授,美国归国博士.博士生导师:人工智能公司专家顾问:长期从事人工智能.物联网.大数据研究:已发表学术论文100多篇,授权发明专利10多项 白勇 ¥88.0 ...

  5. python是基于什么原理_Python基于class()实现面向对象原理详解

    首先,类是一个集合,包含了数据,操作描述的一个抽象集合 你可以首先只把类当做一个容器来使用 class Cycle: def __init__(self,r): self.pi=3.14 self.r ...

  6. Python函数(函数定义、函数调用)用法详解

    函数 函数就是一段封装好的,可以重复使用的代码,它使得我们的程序更加模块化,不需要编写大量重复的代码. 函数可以提前保存起来,并给它起一个独一无二的名字,只要知道它的名字就能使用这段代码.函数还可以接 ...

  7. python代码案例详解-我用Python抓取了7000 多本电子书案例详解

    安装 安装很简单,只要执行: pip install requests-html 就可以了. 分析页面结构 通过浏览器审查元素可以发现这个电子书网站是用 WordPress 搭建的,首页列表元素很简单 ...

  8. python 命令-python解析命令行参数的三种方法详解

    这篇文章主要介绍了python解析命令行参数的三种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python解析命令行参数主要有三种方法: ...

  9. python中requests库的用途-python中requests库session对象的妙用详解

    在进行接口测试的时候,我们会调用多个接口发出多个请求,在这些请求中有时候需要保持一些共用的数据,例如cookies信息. 妙用1 requests库的session对象能够帮我们跨请求保持某些参数,也 ...

  10. python处理excel大数据-Python实现大数据收集至excel的思路详解

    一.在工程目录中新建一个excel文件 二.使用python脚本程序将目标excel文件中的列头写入,本文省略该部分的code展示,可自行网上查询 三.以下code内容为:实现从接口获取到的数据值写入 ...

最新文章

  1. 线程关键字、锁、同步集合笔记
  2. 透过水晶球一瞥下一代SOC
  3. CMake命令之set_property和get_property
  4. session 的用法
  5. C++正则表达式的使用
  6. Python 一次for遍历多个列表及遍历时获取index
  7. Jupyter Notebook的15个技巧和窍门,可简化您的编码体验
  8. windowblinds 6_过年回家选车很重要!锐骐6强势对比纳瓦拉
  9. 《深入理解 Spring Cloud 与微服务构建》第八章 声明式调用 Feign
  10. Java基础学习总结(21)——常用正则表达式列表
  11. C/C++文件操作效率比较——FILE/fstream
  12. vos怎样能快速安装VOS3000
  13. 2014年第五届蓝桥杯C/C++程序设计本科B组省赛 史丰收速算(代码填空)
  14. 【CTF基础】有限域椭圆曲线定义与计算方式
  15. ***的实践总结经验
  16. IC讲解: 如何区分CP测试和FT测试
  17. 一张图看懂梯度、散度、旋度、Jacobian、Hessian和Laplacian
  18. 过敏性鼻炎、感冒、哮喘
  19. 1588分析和实现总纲
  20. 8051单片机的内核的结构及运行过程解析

热门文章

  1. 开发人员:月薪过万与年薪百万之间的差距
  2. 包概念与__init__注意事项
  3. 静物摄影用光技巧_室内人像摄影想要拍好,这3种用光技巧你了解吗?
  4. 设计精美Power Bi报告的诀窍以及让人眼前一亮的精美Power Bi图表
  5. 速览EMNLP 2020上录取的知识图谱相关论文
  6. 在K40小破卡训练50层BERT Large的宝藏trick
  7. 智能投放系统之场景分析最佳实践
  8. 阿里P7架构师要求:Web核心+开源框架+大型网站架构!含面试题目!
  9. 论文浅尝 - ACL2020 | 用于实体对齐的邻居匹配网络
  10. 论文浅尝 - ICLR2020 | 知识图谱中数值规则的可微学习