本篇我们介绍封装(encapsulation)的概念,以及如何在 Python 中利用私有属性实现封装。

封装的概念

面向对象编程包含四个基本的概念:抽象、封装、继承以及多态。封装是指将数据和功能包装在对象中,通过封装可以对外隐藏对象的内部状态。封装因此也被称为信息隐藏。

类就是封装的一个示例,它将数据和方法打包成一个单元。同时类还通过方法提供了属性的访问。

信息隐藏的思想就是如果你有一个外部不可见的属性,你可以控制它的访问,确保对象总是处于有效状态。

下面我们通过一个示例来进一步理解封装的概念。

封装的示例

以下示例定义了一个 Counter 类:

class Counter:def __init__(self):self.current = 0def increment(self):self.current += 1def value(self):return self.currentdef reset(self):self.current = 0

Counter 类拥有一个属性 current,它的默认值为 0。另外 Counter 类包含三个方法:

  • increment() 将属性 current 的值加一。
  • value() 返回属性 current 的当前值。
  • reset() 将属性 current 的值设置为 0。

以下示例创建了一个新的 Counter 类实例,调用三次 increment() 方法,然后打印 counter 变量的当前值:

counter = Counter()counter.increment()
counter.increment()
counter.increment()print(counter.value())

输出结果如下:

3

程序工作正常,但是还有一个问题。我们仍然可以从 Counter 类的外部访问 current 属性并修改它的值。例如:

counter = Counter()counter.increment()
counter.increment()
counter.current = -999print(counter.value())

输出结果如下:

-999

在以上示例中,我们创建了一个 Counter 类的实例,调用两次 ncrement() 方法,然后将 current 属性的值设置为一个无效的数值 -999。

那么如何阻止代码从 Counter 类的外部修改 current 属性呢?为此我们需要使用私有属性。

私有属性

私有属性只能从类的方法中访问。也就是说,我们无法从类的外部访问私有属性。

不过,Python 没有提供私有属性的功能。也就是说,任何属性都可以从类的外部访问。

按照惯例,我们可以在变量名前加上一个下划线(_)表示私有属性:

_attribute

以上语法表示 _attribute 不应该直接访问,而且将来在实现上可能会有重大变化。

以下示例重新定义了 Counter 类,使用惯例将 current 变量修改为私有属性:

class Counter:def __init__(self):self._current = 0def increment(self):self._current += 1def value(self):return self._currentdef reset(self):self._current = 0

名称改写

如果在属性名前面加上双下划线前缀:

__attribute

Python 会自动将 __attribute 属性名修改为以下名称:

_class__attribute

这种行为被称为名称改写(name mangling)。这样一来,我们就无法从外部访问直接访问 __attribute 属性:

instance.__attribute

不过,我们还是可以通过 _class__attribute 访问变量:

instance._class__attribute

以下示例重新定义了 Counter 类:

class Counter:def __init__(self):self.__current = 0def increment(self):self.__current += 1def value(self):return self.__currentdef reset(self):self.__current = 0

此时,如果我们访问 __current 属性,将会返回一个错误:

counter = Counter()
print(counter.__current)
AttributeError: 'Counter' object has no attribute '__current'

但是我们可以通过 _Counter___current 访问 __current 属性:

counter = Counter()
print(counter._Counter__current)
0

总结

  • 封装是将数据和方法打包成一个类,从而隐藏信息和限制外部访问。
  • 按照惯例,单下划线前缀的属性被视为私有属性。
  • Python 会对双下划线前缀的属性进行名称改写。

【Python面向对象编程】第08篇 私有变量相关推荐

  1. [转载] Python面向对象编程系列第一篇

    参考链接: Python中的面向对象编程1(类,对象和成员) 一.类和对象 1.什么是类: 类是现实世界或思维世界中的实体在计算机中的反映,它将数据以及这些数据的操作封装在一起,类是抽象的.类只负责描 ...

  2. 关于python面向对象编程中、下列说法中_关于Python面向对象编程的知识点总结

    前言 如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习Python的面向对象编程. 接下来我们 ...

  3. Python 面向对象编程基础

    Python面向对象编程 简介:面向对象编程--Object Oriented Programming,简称 OOP,是一种程序设计思想.OOP 把对象作为程序的基本单元,一个对象包含了数据和操作数据 ...

  4. (转)Python 面向对象编程(一)

    Python 面向对象编程(一) 虽然Python是解释性语言,但是它是面向对象的,能够进行对象编程.下面就来了解一下如何在Python中进行对象编程. 一.如何定义一个类 在进行python面向对象 ...

  5. python对象编程例子-这是我见过最详细的Python面向对象编程!建议收藏!

    原标题:这是我见过最详细的Python面向对象编程!建议收藏! 面向对象编程和函数式编程(面向过程编程)都是程序设计的方法,不过稍有区别. 面向过程编程: 1. 导入各种外部库 2. 设计各种全局变量 ...

  6. python编程基础是什么-Python面向对象编程基础解析(一)

    1.什么是面向对象 面向对象(oop)是一种抽象的方法来理解这个世界,世间万物都可以抽象成一个对象,一切事物都是由对象构成的.应用在编程中,是一种开发程序的方法,它将对象作为程序的基本单元. 2.面向 ...

  7. 【Python基础】Python 面向对象编程(上篇)

    我的施工计划图 已完成专题包括: 1我的施工计划 2数字专题 3字符串专题 4列表专题 5流程控制专题 6编程风格专题 7函数使用专题 今天是面向对象编程的上篇:基础专题 Python 面向对象编程 ...

  8. python面向对象编程的语言_怎么使用python面向对象编程

    怎么使用python面向对象编程 发布时间:2020-08-25 13:42:19 来源:亿速云 阅读:89 作者:Leah 本篇文章给大家分享的是有关怎么使用python面向对象编程,小编觉得挺实用 ...

  9. Python 面向对象编程

    python是一门解释语音,但是它是面向对象的,可以进行对象编程.在进行python面向对象编程之前,先来了解几个术语:类.类对象.实例对象.属性.函数和方法. 一.如何定义一个类? class pe ...

最新文章

  1. FANUC常用CNC诊断数据表
  2. Moving Average
  3. python整理-day4
  4. 查看mysql数据插入时间_[译] MySQL 最佳实践 —— 高效插入数据
  5. C语言操作符详解 隐式类型转换 (整型提升 算数转换)
  6. Python字符串有关的方法汇总
  7. FPGA与CPLD的区别
  8. figma客户端_小白的Figma入门手册
  9. poj 1887 Testing the CATCHER dp 最大降序
  10. 常见电子元器件检测方法。——Arvin
  11. Lottie动画 轻松使用
  12. 电路仿真软件用matlab,基于MATLAB的电路仿真软件设计.doc
  13. QQ发送PDF为什么显示服务器,为什么QQ接收的PDF文件打不开
  14. 拼写错误python能正常启动吗_拼写检查
  15. 2022年9月11日(星期天):(原创)骑行环草海
  16. EXCEL数据之美:带你走进数据可视化
  17. 企业为什么要大力推进OA办公?
  18. 计算机网络(Vlan划分)
  19. ORACLE 11G 聚合函数
  20. 网贷天眼:11月P2P车贷平台交易规模排行榜

热门文章

  1. python考试复习资料
  2. Linux查看进程命令有哪些?
  3. vue 左右循环滑动_vue实现循环滚动列表
  4. IBAN 国际银行帐户号码 + Swift code + BIC代码
  5. C#之浅析面向对象编程思想(一)
  6. 关于withRouter的原理和用法
  7. 如何设置RTOS任务的堆栈大小?
  8. Ubuntu22.04网卡丢失
  9. php detailview,有关DetailView的文章推荐3篇
  10. python字典的存储结构_解决python字典结构内存暴涨问题