前面章节已经介绍了Python中的多态和继承,本节将介绍面向对象程序设计OOP三大特征的另一个特征--封装。

一、    概念

封装是将对象的状态信息(也就是数据、属性)隐藏在对象内部,将对象的属性和实现细节隐藏起来,不允许外部程序直接访问对象内部信息,而是通过类所提供的方法来实现对内部信息的操作和访问,让方法来控制对这些属性进行安全的访问和操作。实际上封装有两个方面的含义:把该隐藏的隐藏起来,把该暴露的暴露出来。

封装除了隐藏类的数据和实现细节外,可以达到如下目的:

1.    让调用方只能通过类定义的方法来访问类和对象内部的属性和数据,从而可以在相关方法里加入控制逻辑,对数据进行检查和处理,确保属性的访问符合设计者的预期; 

2.    便于修改,所有对该数据的访问都通过方法进行,开发人员只需要保证调用格式和返回数据格式保持不变就可以兼容原有的调用代码,无需修改调用方代码,提高代码的可维护性。

二、    Python封装机制

在大部分面向对象开发的语言如c++和Java语言中,封装是通过私有成员和方法实现的,而Python没有显示定义私有成员的方法,其封装是利用了变量和方法命名的特殊处理来实现的。具体来说:

1.    如果要让内部属性不被外部访问,可以把属性(含方法)的名称前加上两个下划线,在Python中,实例的变量名和方法名如果以两个下划线开头(但不能是两个下划线结尾),就变成了一个私有变量(private),只有内部可以访问,外部不能访问:

1)    Python的私有变量,直接在外部通过实例是无法访问的;

2)    Python私有变量的实现方式是,在Python编译时,对于类定义中所有以两个下划线打头(但不能是两个下划线结尾)的名称都进行转换,在开头加上一个下划线和类名;

3)    Python这种幕后处理手法,使得开发人员能通过名字变换从类和对象外访问私有属性和方法,但这种方式应该禁止,因为直接访问可能导致程序不能遵循设计和开发人员对数据的控制,导致意外的错误。

2.    在Python中,变量名类似__xxx__的,也就是以双下划线开头并且以双下划线结尾的变量和方法,是特殊变量,特殊变量是可以直接访问的,不是私有变量,所以,一般实例变量和类变量以及方法不能用__xxx__这样的方式命名;

3.    在Python中,除了双下划线开头变量是私有变量外,还有一种变量名或方法名以一个下划线开头,这样的实例变量和方法外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,请视为私有变量不要随意访问。Python对这种变量,执行from module import * 不会导入,也就是说import如果不指定导入的方法名,导入时对模块中以一个下划线打头的名称的方法不会导入。

从上所述,Python的封装与常规的OOP语言差异比较大,它没有为私有属性提供直接的支持,要让方法或属性成为私有的,只需让其名称以两个下划线打头即可。这种处理要求程序员知道在什么情况下从外部修改属性是安全的。因此Python无法禁止别人访问对象的私有方法和属性,但这种名称修改方式发出了强烈的信号,让他们不要这样做。

本节介绍了Python中类的封装机制,下节将结合一个案例详细说明。

老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。

欢迎大家批评指正,谢谢大家关注!

第7.8节 Python中隐秘的类封装方法的更多相关文章

  1. 第7.4节 Python中与众不同的类

    一.    引言 在较旧的Python版本中,类型和类之间泾渭分明:内置对象是基于类型的,而自定义对象是基于类的.因此,你可以创建类,但不能创建类型.在较新的Python 2版本中,这种差别不那么明显 ...

  2. 第7.19节 Python中的抽象类详解:abstractmethod、abc与真实子类

    第7.19节 Python中的抽象类详解:abstractmethod.abc与真实子类 一.    引言 前面相关的章节已经介绍过,Python中定义某种类型是以实现了该类型对应的协议为标准的,而不 ...

  3. 第7.15节 Python中classmethod定义的类方法详解

    第7.15节  Python中classmethod定义的类方法详解 类中的方法,除了实例方法外,还有两种方法,分别是类方法和静态方法.本节介绍类方法的定义和使用. 一.    类方法的定义 在类中定 ...

  4. 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解

    第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一.    引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...

  5. 第7.22节 Python中使用super调用父类的方法

    第7.22节 Python中使用super调用父类的方法 前面章节很多地方都引入了super方法,这个方法就是访问超类这个类对象的.由于super方法的特殊性,本节单独谈一谈super方法. 一.su ...

  6. 第8.23节 Python中使用sort/sorted排序与“富比较”方法的关系分析

    一. 引言 <第8.21节 Python中__lt__.gt__等 "富比较"("rich comparison")方法用途探究>和<第8.2 ...

  7. 第8.27节 Python中__getattribute__与property的fget、@property装饰器getter关系深入解析

    一. 引言 在<第7.23节 Python使用property函数定义属性简化属性访问的代码实现>和<第7.26节 Python中的@property装饰器定义属性访问方法gette ...

  8. 第11.20节 Python 中正则表达式的扩展功能:后视断言、后视取反

    一. 引言 在<第11.19节 Python 中正则表达式的扩展功能:前视断言和前视取反>中老猿介绍了前视断言和前视取反,与二者对应的还有后视断言和后视取反. 二. (?<=-)后视 ...

  9. 第14.12节 Python中使用BeautifulSoup解析http报文:使用select方法快速定位内容

    一. 引言 在<第14.10节 Python中使用BeautifulSoup解析http报文:html标签相关属性的访问>和<第14.11节 Python中使用BeautifulSo ...

随机推荐

  1. 为研发同学定制的MySQL面试指南 - “能谈谈基数统计吗?”

    ** 目录 推荐阅读原文链接 一.基数是啥? 二.InnoDB更新基数的时机? 三.基数是估算出来 四.持久化基数 四.如何主动更新基数? 欢迎关注 Hi,大家好!我是白日梦. 今天我要跟你分享的话题 ...

  2. CI框架导入 excel

    整合PHP  Excel和PHPexcelReader到 librarys下面     两个excel整合成一个excel   <?php class Excel extends Control ...

  3. 13 SOAP

    13 SOAP SOAP(原为Simple Object Access Protocol的首字母缩写,即简单对象访问协议)是交换数据的一种协议规范,使用在计算机网络Web服务(web service) ...

  4. 类似阿里双十一的可视化看板是怎么做的?无人机三维GIS看板也来了!

    天猫双十一数据可视化看板 每年的双十一,天猫都会在整点时刻直播战绩,惊叹于可怕战绩的同时,也会被背后展示的数据大屏吸引,这样让人眼前一亮的可视化数据看板是怎么做出来的? 所谓可视化数据看板,就是挂在墙 ...

  5. 两个SQL查询,横向合并为一个查询结果

    第一条sql: select unit,count(*)as number from archives_management group by unit 第二条sql: select fine_uni ...

  6. 在spark上构造随机森林模型过程的一点理解

    这篇文章仅仅是为了帮助自己理解在分布式环境下是如何进行随机森林模型构建的,文章中记录的内容可能不太准确,仅仅是大致上的一个理解. 1.特征切分点统计 不管是连续取值型特征还是离散取值型特征,分裂树结点 ...

  7. UNP——第二章,TCP状态,TIME_WAIT

    状态可以用 netstat 验证 加粗线为 数据交换. 可以看出,TCP在 建立连接和 关闭连接,耗费资源, 因为UDP只需要两次数据通信即可. 但UDP没有可靠传输,和流量控制. 上面协商的MSS为 ...

  8. SpringAop切面实现日志记录

    SpringAop切面实现日志记录代码实现:https://www.cnblogs.com/wenjunwei/p/9639909.html 问题记录 1.signature.getMethod(). ...

  9. kali 更新msf

    用leafpad打开,方便复制粘贴 leafpad /etc/apt/sources.list 然后复制下面的源覆盖原本的 deb http://mirrors.ustc.edu.cn/kali ka ...

  10. prometheus监控实战--基础

    1.简介 prometheus就是监控系统+TSDB(时间序列数据库),通过pull方式从exporter获取时间序列数据,存入本地TSDB,被监控端需安装exporter作为http端点暴露指标数据 ...