封装

2024-08-06 20:59:56 浏览数 (4)

前言

在面向对象编程(OOP)中,封装是一个重要的概念,旨在保护数据并限制对对象内部状态的直接访问。在 Python 中,私有成员是实现封装的关键工具。本章详细讲解了封装的基本概念以及私有成员的用法。


本篇文章参考:黑马程序员

一、基本概念

面向对象编程是一种许多编程语言支持的编程思想。简单来说,它是通过基于模板(类)创建实体(对象),并利用这些对象进行功能开发。

面向对象的三大特性

  • 封装
  • 继承
  • 多态

封装:将现实世界的事物用类来描述,具体表现为属性和方法。

通俗来讲,封装就是将事物的属性和行为整合到一个类中,通过成员变量和成员方法来实现对现实世界事物的描述。这样,程序能够更清晰地反映现实世界的复杂性。

现实世界中的事物有属性和行为,但并非所有的属性和行为都是对用户开放的。以手机为例,手机的基本属性如品牌、型号和长度,以及基本行为如上网、拍照和通话,都是对用户开放的。但是手机也有一系列对用户隐藏的属性和行为,比如运行电压、驱动信息等属性以及程序调度、内存管理等行为。

二、私有成员

因为现实事物有不公开的属性和行为,所以作为现实事物在程序中映射的类也有不公开的属性和行为。

为了实现这一点,类提供了私有成员的形式来支持:

  • 私有成员变量: 变量名以__开头(2个下划线)
  • 私有成员方法: 方法名以__开头(2个下划线)

私有成员的存在具有实际意义,它们专门用于类的内部,在类中提供仅供内部使用的属性和方法,而不对外开放(类对象无法使用),从而避免被外部访问。

这样的设计可保护类的内部数据和行为,不被外部随意修改,有助于维护数据的一致性和安全性,从而提高程序的可靠性。

私有成员方法不支持类外部直接访问:

代码语言:python代码运行次数:0复制
# 定义一个类,内含私有成员变量和私有成员方法
class Phone:
    # 私有成员变量
    __current_voltage=None   # 手机运行电压
    # 私有成员方法
    def __keep_single_core(self):
        print("让CPU单核运行")
# 私有成员方法不支持类外部直接访问
phone=Phone()
phone.__keep_single_core()

输出结果:

私有成员变量不支持类外部直接访问:

代码语言:python代码运行次数:0复制
# 定义一个类,内含私有成员变量和私有成员方法
class Phone:
    # 私有成员变量
    __current_voltage=None   # 手机运行电压
    # 私有成员方法
    def __keep_single_core(self):
        print("让CPU单核运行")

phone=Phone()
print(phone.__current_voltage)

输出结果:

私有成员(包括私有成员变量和私有成员方法)可以在类的内部被类的其他成员(如方法)访问,但无法通过类的实例在外部访问。

代码语言:python代码运行次数:0复制
# 定义一个类,内含私有成员变量和私有成员方法
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私有成员

代码语言:python代码运行次数:0复制
# 定义一个类,用来描述手机
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网络

正在通话中

0 人点赞