前面章节已经介绍了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. 浅谈js for循环输出i为同一值的问题

    问题再现 ​ 最近开发中遇到一个问题,为什么每次输出都是5,而不是点击每个p,就alert出对应的1,2,3,4,5. <html> <head> <meta http- ...

  2. JS函数命名规范

    语法规范: 任何合法的javascript标识符都可以作为函数的名称. 约定俗成的内容:(非ECMAScript语法,但是为了便于开发者理解和识别,约定的函数命名规范.) 命名方法: 小驼峰式命名法 ...

  3. JS小案例:循环间隔重复变色

    在A.B.C三个区块中,有且仅有一个红色,要求红色每隔一秒即进入下一个区块,变色过程不断循环往复. 参考代码: <!DOCTYPE html> <html lang="zh ...

  4. 这个Map你肯定不知道,毕竟存在感确实太低了。

    这是why哥的第 75 篇原创文章 从Dubbo的优雅停机说起 好吧,其实本文并不是讲 Dubbo 的优雅停机的. 只是我在 Dubbo 停机方法 DubboShutdownHook 类中,看到了这样 ...

  5. linux 进程间通信 共享内存 shmat

    系统调用mmap()通过映射一个普通文件实现共享内存.系统V则是通过映射特殊文件系统shm中的文件实现进程间的共享内存通信.也就是说,每个共享内存区域对应特殊文件系统shm中的一个文件(这是通过shm ...

  6. MYSQL 存储引擎(面)

    存储引擎是MySQL的组件,用于处理不同表类型的SQL操作.不同的存储引擎提供不同的存储机制.索引技巧.锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能. 使用哪一种引擎可以灵活选择,一个数据 ...

  7. docker学习汇总

    学习思路: l Docker是什么? l Docker有什么特点? l Docker 怎么用? l 不论什么知识框架都要以官方文档为主 一.认识docker Docker的概念 Docker是一个开源 ...

  8. NPOT纹理与平铺模式OpenGL规范

    OpenGL规范从2.0开始支持显示边长为非2次幂的Texture,但限制条件是需要环绕模式为CLAMP_TO_EDGE并且过滤模式为NEAREST或者LINEAR. 解除限制的条件是硬件支持OES_ ...

  9. redis源码学习之slowlog

    目录 背景 环境说明 redis执行命令流程 记录slowlog源码分析 制造一条slowlog slowlog分析 1.slowlog如何开启 2.slowlog数量限制 3.slowlog中的耗时 ...

  10. v-echarts安装

    npm install v-echarts echarts --save