探索Python中封装的概念与实践

更多资料获取

📚 个人网站:ipengtao.com


封装是面向对象编程中的核心概念,它能够帮助程序员隐藏类的内部细节,并限制对类成员的直接访问。本文将深入探讨Python中封装的机制,介绍封装的类型和优势,并提供详细的示例展示如何在Python中实现封装。

封装的类型与作用域

在Python中,封装通过命名约定和访问修饰符来实现,以限制对类成员的访问。这包括公有、私有和受保护成员,它们在作用域和访问权限上有所不同。

公有成员

公有成员在Python中是默认的,不需要特殊的修饰符。它们可以被类的实例以及类外部的代码访问。

class MyClass:
    def __init__(self):
        self.public_var = "Public"  # 公有成员

obj = MyClass()
print(obj.public_var)  # 类的实例可以直接访问公有成员

私有成员

Python中的私有成员可以通过在属性名前加上双下划线 __ 来定义。这样的属性在类的外部是无法直接访问的,但在类内部是可以访问的。

class MyClass:
    def __init__(self):
        self.__private_var = "Private"  # 私有成员

    def get_private_var(self):
        return self.__private_var  # 在类内部可以访问私有成员

obj = MyClass()
# print(obj.__private_var)  # 试图在类外访问将会导致 AttributeError
print(obj.get_private_var())  # 通过类方法访问私有成员

受保护成员

Python中没有严格意义上的受保护成员,但是通过在属性名前加上单下划线 _,来暗示这是一个受保护的属性,应该避免在类外部直接访问。

class MyClass:
    def __init__(self):
        self._protected_var = "Protected"  # 受保护成员

obj = MyClass()
print(obj._protected_var)  # 在类外部可以访问受保护成员,但不建议这样做

封装通过这些命名约定和访问修饰符来限制对类成员的直接访问,提高了代码的安全性和可维护性。

封装的优势和重要性

1. 增强安全性

封装可以隐藏对象的内部细节,限制了对类的属性和方法的直接访问。这样的封装机制使得一些关键数据对外部代码不可见,从而降低了程序被错误操作或非法访问的风险,提高了数据的安全性。

2. 降低耦合性

通过封装,对象的内部实现和外部接口可以相互独立。这意味着当对象的内部实现发生变化时,外部代码无需做出相应的修改,只要对象的接口保持不变,就能够正常使用。

3. 提高可维护性

封装能够简化代码逻辑和维护过程。由于隐藏了内部细节,代码变得更清晰、更易于理解,减少了不必要的复杂性,提高了代码的可维护性。任何需要变更的部分都集中在对象内部,而不会对外部代码造成过多的影响。

4. 促进代码重用

通过封装的设计,类的功能模块化,可以被其他部分或其他类重复利用。封装使得代码更加模块化,可以减少代码冗余,提高了代码的可复用性和可扩展性。

封装在实践中的应用

在实际编程中,封装经常被用于控制对类的私有属性的访问,这可以通过使用getter和setter方法来实现。此外,在Python中,使用装饰器 property 可以更加优雅地实现属性的封装。

使用Getter和Setter方法

class Person:
    def __init__(self, name):
        self._name = name  # 私有属性

    # Getter方法
    def get_name(self):
        return self._name

    # Setter方法
    def set_name(self, value):
        if value:
            self._name = value

person = Person("Alice")
print(person.get_name())  # 获取属性值
person.set_name("Bob")   # 设置属性值
print(person.get_name())

在上述示例中,_name 被定义为私有属性,而 get_name()set_name() 方法提供了间接访问这个私有属性的途径,从而实现了封装。这种方式能够保护属性的值,只允许在类内部进行更改。

使用装饰器 property

在Python中,property 装饰器提供了一种更加优雅的方式来定义属性,通过 @property 来创建只读属性,同时可以使用 @property.setter 来创建可写属性。

class MyClass:
    def __init__(self):
        self._value = 0

    @property
    def value(self):
        return self._value

    @value.setter
    def value(self, new_value):
        if new_value > 0:
            self._value = new_value

obj = MyClass()
print(obj.value)  # 获取属性值
obj.value = 10  # 设置属性值
print(obj.value)

使用 @property 装饰器,类中的方法就能够像访问属性一样被调用,这使得代码更加简洁、易读且易维护。@property.setter 装饰器则允许对属性进行赋值,并通过设定条件来限制对属性的赋值。这种方式实现了对属性的更精细的封装。

使用装饰器实现封装

当使用 property 装饰器时,可以更加简洁地定义类的属性,并通过 getter 和 setter 方法来限制对属性的访问。这是 Python 中实现封装的一种常见且优雅的方式。

1. 创建只读属性

通过 @property 装饰器,可以定义只读属性。这意味着只能获取属性的值,而不能对其进行赋值。

class MyClass:
    def __init__(self):
        self._value = 0

    @property
    def value(self):
        return self._value

obj = MyClass()
print(obj.value)  # 获取属性值
# obj.value = 10  # 尝试设置只读属性会导致 AttributeError

在这个例子中,value 方法被 @property 装饰器修饰,使得 value 方法可以像属性一样被访问。

2. 创建可写属性

如果希望属性可以被设置值,可以使用 @property.setter 装饰器,通过这种方式限制对属性的赋值。

class MyClass:
    def __init__(self):
        self._value = 0

    @property
    def value(self):
        return self._value

    @value.setter
    def value(self, new_value):
        if new_value > 0:
            self._value = new_value

obj = MyClass()
print(obj.value)  # 获取属性值
obj.value = 10  # 设置属性值
print(obj.value)

通过 @property.setter 装饰器,value 方法变成了一个可写属性,并在设置属性值时进行了条件限制。

这种方式简化了代码,使得属性的读写操作看起来更像是直接访问属性一样,并在需要对属性进行特殊处理时提供了灵活性。此外,它也遵循了 Python 的命名约定,使代码更加易读易懂。

总结

封装是面向对象编程中不可或缺的概念,它为代码提供了安全性、可维护性和可扩展性。适当的封装能够提高代码质量,降低开发过程中出现的错误,同时促进代码的可重用性和可读性。在实践中,合理运用封装原则将大大改善代码的质量和可维护性,是提升软件开发效率和代码质量的重要手段。


Python学习路线

在这里插入图片描述

更多资料获取

📚 个人网站:ipengtao.com

如果还想要领取更多更丰富的资料,可以点击文章下方名片,回复【优质资料】,即可获取 全方位学习资料包。

在这里插入图片描述
点击文章下方链接卡片,回复【优质资料】,可直接领取资料大礼包。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/231540.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

重写 AppiumService 类,添加默认启动参数,并实时显示启动日志

一、前置说明 在Appium的1.6.0版本中引入了AppiumService类,可以很方便的通过该类来管理Appium服务器的启动和停止。经过测试,使用该类的实例执行关闭server时,并没有释放端口号,会导致第二次启动时失败。另外,使用该…

什么是MyBatis、什么是MyBatis-Plus、简单详细上手案例

什么是MyBatis MyBatis是一个开源的Java持久层框架,用于简化与关系型数据库的交互。它通过将SQL语句与Java代码进行分离,提供了一种优雅的方式来处理数据库操作。 MyBatis的核心思想是将SQL语句与Java方法进行映射,使得开发人员可以通过配置…

Java LeetCode篇-深入了解二叉树的经典解法(多种方式实现:构造二叉树)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 从前序与中序遍历序列来构造二叉树 1.1 实现从前序与中序遍历序列来构造二叉树思路 1.2 代码实现从前序与中序遍历序列来构造二叉树 2.0 从中序与后序遍历序…

实用篇 | 一文学会人工智能中API的Flask编写(内含模板)

----------------------- 🎈API 相关直达 🎈-------------------------- 🚀Gradio: 实用篇 | 关于Gradio快速构建人工智能模型实现界面,你想知道的都在这里-CSDN博客 🚀Streamlit :实用篇 | 一文快速构建人工智能前端展…

【优选算法系列】【专题二滑动窗口】第三节.904. 水果成篮和438. 找到字符串中所有字母异位词

文章目录 前言一、水果成篮 1.1 题目描述 1.2 题目解析 1.2.1 算法原理 1.2.2 代码编写 1.2.3 题目总结二、找到字符串中所有字母异位词 2.1 题目描述 2.2 题目解析 2.2.1 算法原理 2.2.2 代码编写 …

OpenAI 首席运营官(COO)Brad Lightcap认为商业人工智能被夸大了

美国消费者新闻与商业频道(CNBC)是美国NBC环球集团持有的全球性财经有线电视卫星新闻台,是全球财经媒体中的佼佼者,其深入的分析和实时报导赢得了全球企业界的信任。在1991年前,使用消费者新闻与商业频道(C…

node.js和npm的安装与环境配置(2023最新版)

目录 安装node.js测试是否安装成功测试npm环境配置更改环境变量新建系统变量 安装node.js 1、进入官网下载:node.js官网 我选择的是windows64位的,你可以根据自己的实际情况选择对应的版本。 2、下载完成,安装。 打开安装程序 接受协议 选…

链表OJ—环形链表的约瑟夫问题

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 前言 世上有两种耀眼的光芒,一种是正在升起的太阳,一种是正在努力学习编程的你!一个爱学编程的人。各位看官,我衷心的希望这篇博客能对你…

操作系统———磁盘调度算法模拟

实验目的 磁盘是可供多个进程共享的设备,当有多个进程都要求访问磁盘是,应采用一种最佳调度算法,以使各进程对磁盘的平均访问时间最小。目前最成用的磁盘调度算法有先来先服务(FCFS),最短寻道时间优先&…

增加网站流量的方法

如果您的网站没有获得足够的流量,您可能会错过在线发展业务的重要机会。搜索引擎优化(SEO)可以帮助提高您网站的知名度,从而吸引更多客户。 SEO的重点是识别高价值的关键词,并将它们整合到网站的内容中,使…

【设计模式-3.2】结构型——适配器模式

说明:本文介绍设计模式中结构型设计模式中的,适配器模式; 插头转换器 适配器模式属于结构型设计模式,设计思想体现在结构上的。以插头转换器为例,当你需要给手机充电,但是眼前只有一个三孔插座&#xff0…

MES管理系统在非标制造企业中的应用

在当今制造业中,非标制造企业逐渐成为一种重要的存在。与传统的批量生产制造企业不同,非标制造企业主要特点是能够根据客户需求进行定制化生产。这种定制化的生产模式对企业的管理提出了更高的要求,同时也带来了更多的挑战。在非标制造企业中…

Emacs之Plantuml用于复杂UML类图(Markdown用于简单类图)(一百三十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

MQTT主题、通配符和最佳实践

MQTT主题在MQTT生态系统非常重要,因为代理(broker)依赖主题确定哪个客户端接收指定的主题。本文我们将聚集MQTT主题、MQTT通配符,详细讨论使用它们的最佳实践,也会探究SYS主题,提供给代理(broke…

超越极限!如何进行高效分布式性能测试,让Jmeter揭示并发下系统的真正实力

一、为什么要进行分布式性能测试 当进行高并发性能测试的时候,受限于Jmeter工具本身和电脑硬件的原因,无法满足我们对大并发性能测试的要求。 基于这种场景下,我们就需要采用分布式的方式来实现我们高并发的性能测试要求。 二、分布式性能测…

深度学习记录--激活函数

激活函数的种类 对于激活函数的选择,通常有以下几种 sigmoid,tanh,ReLU,leaky ReLU 激活函数的选择 之前logistic回归一直使用的激活函数都是sigmoid函数,但一般来说,tanh函数是比sigmoid函数更加好的选…

【小白专用】在 vs 中使用 nuget 安装NPOI

C#操作Excel有多种方法,如通过数据库的方式来读写Excel的OleDb方式,但是OleDb方式需要安装微软office,还可以通过COM组件方式操作Excel,也需要安装微软Excel。如果不想安装微软办公套餐可以使用ClosedXML、EPPlus、NPOI。本文主要…

理解IoC容器初始化

问题:当自己面试或者背诵八股文时,会背到各种各样的spring底层的东西,自己越看越迷糊。 OS:不知道兄弟们是不是也会这样?如果大家没有说明我太菜了。 原因:就是自己学的框架越来越多,很多框架…

线性回归实战

3.1 使用正规方程进行求解 3.1.1 简单线性回归 公式 : y w x b y wx b ywxb 一元一次方程,在机器学习中一元表示一个特征,b表示截距,y表示目标值。 使用代码进行实现: 导入包 import numpy as np import matp…

bc-linux-欧拉重制root密码

最近需要重新安装虚拟机的系统 安装之后发现对方提供的root密码不对,无法进入系统。 上网搜了下发现可以进入单用户模式进行密码修改从而重置root用户密码。 在这个界面下按e键 找到图中部分,把标红的部分删除掉,然后写上rw init/bin/…