前面章节已经介绍了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. 一个 Task 不够,又来一个 ValueTask ,真的学懵了!

    一:背景 1. 讲故事 前几天在项目中用 MemoryStream 的时候意外发现 ReadAsync 方法多了一个返回 ValueTask 的重载,真是日了狗了,一个 Task 已经够学了,又来一个 ...

  2. MySQL全面瓦解9:查询的排序、分页相关

    概述 数据库中的数据直接呈现出来一般不是我们想要的,所以我们上两节演示了如何对数据进行过滤的方法.除了对数据进行过滤, 我们可能还需要对数据进行排序,比如想从列表中了解消费最高的项,就可能需要对金额字 ...

  3. SU+GIS,让SketchUp模型在地图上活起来

    一.SU+GIS的场景展示 skp与卫星地图和倾斜摄影模型相结合人工模型与实景模型完美融合 这么一看是不是直接秒杀了单纯看看skp后联想的规划效果? 二.如何快速把草图大师的结果和GIS结合呢?在图新 ...

  4. Flink基础:时间和水印

    ​ 往期推荐: Flink基础:入门介绍 Flink基础:DataStream API Flink基础:实时处理管道与ETL Flink深入浅出:资源管理 Flink深入浅出:部署模式 Flink深入 ...

  5. TextView之富文本

    项目中使用富文本比较常见了,一行显示多种样式颜色的文本,使用 ClickableSpan 富文本实现在同一个 TextView 中的文本的颜色.大小.背景色等属性的多样化和个性化. 我们也可以使用Ht ...

  6. linux帮助手册(help/man/info)

    linux本身有数据库(数据库名whatis)--man实际是从whatis数据库里查找信息. makewhatis 刚装系统,若man不能用,用makewhatis命令.整理whatis数据库. 当 ...

  7. 卸载python安装的软件

    python源码安装的软件是无法通过命令卸载的,这个可以通过记录安装过程的形式来卸载安装的软件 以 python2.7.2 为例,在这个目录中有一个 setup.py 的文件,很显然这是安装程序,还是 ...

  8. 网页中审查元素(按F12)与查看网页源代码的区别

    问题 在验证目标系统是含有XSS漏洞,查看源代码,看不到插入的跨站脚本代码. 原理 所谓查看源代码,就是别人服务器发送到浏览器的原封不动的代码. 审查元素时,你看到那些,在源代码中找不到的代码,是在浏 ...

  9. 如何查看CDR文件是出自哪个版本?

    如何才能知道某个cdr文件用哪个版本的CorelDRAW软件打开?网上CorelDRAW软件有很多版本,都不知该下哪个了?这是我听到大家问道最多的问题,这是因为CDR低版本软件打不开高版本文件. 方法 ...

  10. 换系统之后为什么iMindMap会提示“许可证使用的次数过多”

    iMindMap是一款十分受欢迎的思维导图软件,随着12版本的上线,iMindMap新增了很多新用户,最近小编发现有不少新用户在群里反映:"为什么购买iMindMap时说可以支持换机,但是在 ...