python的底层实现,Python封装底层实现原理详解(通俗易懂)
事实上,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封装底层实现原理详解(通俗易懂)相关推荐
- python一行代码完成正态分布检验,附原理详解
在进行数据分析处理的过程中,经常需要判断数据是否符合正太分布,正常的正太分布检验费时费力,本文介绍如何通过python快速实现对正太分布的检验: 前方高能!!!看如何一行代码实现数据的正太分布检验 f ...
- python函数定义及调用-python函数声明和调用定义及原理详解
这篇文章主要介绍了python函数声明和调用定义及原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 函数是指代码片段,可以重复调用,比如我们前 ...
- python函数声明和调用定义及原理详解
这篇文章主要介绍了python函数声明和调用定义及原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 函数是指代码片段,可以重复调用,比如我们前 ...
- 视频教程-深度学习原理详解及Python代码实现-深度学习
深度学习原理详解及Python代码实现 大学教授,美国归国博士.博士生导师:人工智能公司专家顾问:长期从事人工智能.物联网.大数据研究:已发表学术论文100多篇,授权发明专利10多项 白勇 ¥88.0 ...
- python是基于什么原理_Python基于class()实现面向对象原理详解
首先,类是一个集合,包含了数据,操作描述的一个抽象集合 你可以首先只把类当做一个容器来使用 class Cycle: def __init__(self,r): self.pi=3.14 self.r ...
- Python函数(函数定义、函数调用)用法详解
函数 函数就是一段封装好的,可以重复使用的代码,它使得我们的程序更加模块化,不需要编写大量重复的代码. 函数可以提前保存起来,并给它起一个独一无二的名字,只要知道它的名字就能使用这段代码.函数还可以接 ...
- python代码案例详解-我用Python抓取了7000 多本电子书案例详解
安装 安装很简单,只要执行: pip install requests-html 就可以了. 分析页面结构 通过浏览器审查元素可以发现这个电子书网站是用 WordPress 搭建的,首页列表元素很简单 ...
- python 命令-python解析命令行参数的三种方法详解
这篇文章主要介绍了python解析命令行参数的三种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python解析命令行参数主要有三种方法: ...
- python中requests库的用途-python中requests库session对象的妙用详解
在进行接口测试的时候,我们会调用多个接口发出多个请求,在这些请求中有时候需要保持一些共用的数据,例如cookies信息. 妙用1 requests库的session对象能够帮我们跨请求保持某些参数,也 ...
- python处理excel大数据-Python实现大数据收集至excel的思路详解
一.在工程目录中新建一个excel文件 二.使用python脚本程序将目标excel文件中的列头写入,本文省略该部分的code展示,可自行网上查询 三.以下code内容为:实现从接口获取到的数据值写入 ...
最新文章
- 线程关键字、锁、同步集合笔记
- 透过水晶球一瞥下一代SOC
- CMake命令之set_property和get_property
- session 的用法
- C++正则表达式的使用
- Python 一次for遍历多个列表及遍历时获取index
- Jupyter Notebook的15个技巧和窍门,可简化您的编码体验
- windowblinds 6_过年回家选车很重要!锐骐6强势对比纳瓦拉
- 《深入理解 Spring Cloud 与微服务构建》第八章 声明式调用 Feign
- Java基础学习总结(21)——常用正则表达式列表
- C/C++文件操作效率比较——FILE/fstream
- vos怎样能快速安装VOS3000
- 2014年第五届蓝桥杯C/C++程序设计本科B组省赛 史丰收速算(代码填空)
- 【CTF基础】有限域椭圆曲线定义与计算方式
- ***的实践总结经验
- IC讲解: 如何区分CP测试和FT测试
- 一张图看懂梯度、散度、旋度、Jacobian、Hessian和Laplacian
- 过敏性鼻炎、感冒、哮喘
- 1588分析和实现总纲
- 8051单片机的内核的结构及运行过程解析
热门文章
- 开发人员:月薪过万与年薪百万之间的差距
- 包概念与__init__注意事项
- 静物摄影用光技巧_室内人像摄影想要拍好,这3种用光技巧你了解吗?
- 设计精美Power Bi报告的诀窍以及让人眼前一亮的精美Power Bi图表
- 速览EMNLP 2020上录取的知识图谱相关论文
- 在K40小破卡训练50层BERT Large的宝藏trick
- 智能投放系统之场景分析最佳实践
- 阿里P7架构师要求:Web核心+开源框架+大型网站架构!含面试题目!
- 论文浅尝 - ACL2020 | 用于实体对齐的邻居匹配网络
- 论文浅尝 - ICLR2020 | 知识图谱中数值规则的可微学习