欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能!
文章目录
- 前言
- 一、基本概念
- 二、私有成员
前言
在面向对象编程(OOP)中,封装是一个重要的概念,旨在保护数据并限制对对象内部状态的直接访问。在 Python 中,私有成员是实现封装的关键工具。本章详细讲解了封装的基本概念以及私有成员的用法。
本篇文章参考:黑马程序员
一、基本概念
面向对象编程是一种许多编程语言支持的编程思想。简单来说,它是通过基于模板(类)创建实体(对象),并利用这些对象进行功能开发。
面向对象的三大特性:
- 封装
- 继承
- 多态
封装:将现实世界的事物用类来描述,具体表现为属性和方法。
通俗来讲,封装就是将事物的属性和行为整合到一个类中,通过成员变量和成员方法来实现对现实世界事物的描述。这样,程序能够更清晰地反映现实世界的复杂性。
现实世界中的事物有属性和行为,但并非所有的属性和行为都是对用户开放的。以手机为例,手机的基本属性如品牌、型号和长度,以及基本行为如上网、拍照和通话,都是对用户开放的。但是手机也有一系列对用户隐藏的属性和行为,比如运行电压、驱动信息等属性以及程序调度、内存管理等行为。
二、私有成员
因为现实事物有不公开的属性和行为,所以作为现实事物在程序中映射的类也有不公开的属性和行为。
为了实现这一点,类提供了私有成员的形式来支持:
- 私有成员变量:
变量名以__开头(2个下划线) - 私有成员方法:
方法名以__开头(2个下划线)
私有成员的存在具有实际意义,它们专门用于类的内部,在类中提供仅供内部使用的属性和方法,而不对外开放(类对象无法使用),从而避免被外部访问。
这样的设计可保护类的内部数据和行为,不被外部随意修改,有助于维护数据的一致性和安全性,从而提高程序的可靠性。
私有成员方法不支持类外部直接访问:
# 定义一个类,内含私有成员变量和私有成员方法
class Phone:
# 私有成员变量
__current_voltage=None # 手机运行电压
# 私有成员方法
def __keep_single_core(self):
print("让CPU单核运行")
# 私有成员方法不支持类外部直接访问
phone=Phone()
phone.__keep_single_core()
输出结果:
私有成员变量不支持类外部直接访问:
# 定义一个类,内含私有成员变量和私有成员方法
class Phone:
# 私有成员变量
__current_voltage=None # 手机运行电压
# 私有成员方法
def __keep_single_core(self):
print("让CPU单核运行")
phone=Phone()
print(phone.__current_voltage)
输出结果:
私有成员(包括私有成员变量和私有成员方法)可以在类的内部被类的其他成员(如方法)访问,但无法通过类的实例在外部访问。
# 定义一个类,内含私有成员变量和私有成员方法
class Phone:
# 私有成员变量
__current_voltage=1 # 手机运行电压
# 私有成员方法
def __keep_single_core(self):
print("CPU以单核模式运行")
# 5G通话方法
def call_by_5g(self):
if self.__current_voltage>=1:
print("5G通话已开启")
else:
self.__keep_single_core()
print("电量不足,无法使用5g通话,并已设置为单核运行")
phone=Phone()
phone.call_by_5g()
输出结果:
5G通话已开启
【例题】
设计一个手机类,内部包含:
①私有成员变量:__is_5g_enable,类型为bool,True表示开启5g,False表示关闭5g;
②私有成员方法:__check_5g(),会判断私有成员__is_5g_enable的值,若为True,打印输出“5g开启”;若为False,打印输出“5g关闭,使用4g网络”;
③公开成员方法:call_by_5g(),调用它会执行调用私有成员方法__check_5g(),判断5g网络状态,打印输出“正在通话中”。
【分析】
对用户公开的:call_by_5g()方法
对用户隐藏的:__is_5g_enable私有变量和__check_5g私有成员
# 定义一个类,用来描述手机
class Phone:
# 私有成员变量
__is_5g_enable=False # 5g状态
# 私有成员方法
def __check_5g(self):
if self.__is_5g_enable:
print("5g开启")
else:
print("5g关闭,使用4g网络")
# 公开成员方法
def call_by_5g(self):
self.__check_5g()
print("正在通话中")
phone=Phone()
phone.call_by_5g()
输出结果:
5g关闭,使用4g网络
正在通话中