Python自学 - 封装与私有化

1 Python自学 - 封装与私有化

1.1 封装的概念

  封装是指将数据和方法封装在一起,并且需要通过类的实例来访问,这样就可以确保合适的方法来处理合适的数据,并可以做到只给外界看到想给外界看到的接口,减少数据或方法被滥用的风险。
  读者如果还记得类的定义(属性、方法)章节的内容,一定会想起函数式编程里面,可以搞出“人吃草”、“牛吃粮食”的荒唐事来,“人会不会吃草”,完全仰仗编程人员的水平。而使用类封装过后,人就是人,牛就是牛, 人就干人事,牛就干牛事,少了一些荒唐(不能保证绝对没有!毕竟,人类啥事都做得出来!)

示例代码:

class Person:def __init__(self, name, age):self.name = nameself.age = agedef display(self):print(f"Name: {self.name}, Age: {self.age}")# 创建 Person 类的实例
person = Person("Alice", 30)
person.display()

上述示例中的Person类封装了nameagedisplay方法,这些属性和方法只适用于Person类创建的对象,绝对不会和Cow类混用。

1.2 私有化

Python不像JavaC++C#等语言,Python没有提供了关键字publicprivate, protect用来表示属性或方法的适用范围。
  但Python提供了一些折中的方法来控制属性或方法的范围。

1.2.1 方法1:使用单下划线_前缀

  使用单下划线 _ 作为属性或方法的前缀,仅是一种约定,表示该成员应该被视为受保护的,即不应该被外部直接访问,但实际上仍然可以被访问

class Person:def __init__(self, name, age):self._name = nameself._age = agedef display(self):print(f"Name: {self._name}, Age: {self._age}")# 创建 Person 类的实例
person = Person("Bob", 25)
person.display()
print(person._name)  # 可以访问,但不建议

1.2.2 方法2:使用双下划线__前缀

  使用双下划线 __ 作为属性或方法的前缀,会将其名称进行名称改编(name mangling),使得从外部难以直接访问该成员,实际上如果读者知道改名规则后,仍然可以直接使用改名后的名称访问。
  实际上只是把属性或方法稍稍进行了掩人耳目,并没有严格进行私有化限定。
示例:

class Person:def __init__(self, name, age):self.__name = nameself.__age = agedef display(self):print(f"Name: {self.__name}, Age: {self.__age}")# 创建 Person 类的实例
person = Person("Charlie", 40)
person.display()
# 以下会报错,因为 __name 已经被名称改编
# print(person.__name)# 可以通过名称改编后的名称访问,但不建议
print(person._Person__name)

改名的规则是在原名前再加_类名做为前缀。

  • 封装和私有化的优点
    • 信息隐藏:将内部实现细节隐藏,只暴露必要的接口,使类的使用更加简单和安全。
    • 防止意外修改:限制外部对重要数据和方法的直接访问,避免意外修改导致的错误。
    • 代码可维护性:可以方便地修改内部实现,而不影响外部代码,只要保持公共接口不变。

总结:不管是加_前缀还是__前缀,Python的私有化更像是一个障眼法,读者需要自己养成良好的代码习惯。


作者声明:本文用于记录和分享作者的学习心得,部分内容或示例来自豆包AI,由于本人水平有限,难免存在表达错误,欢迎交流和指教!
Copyright © 2022~2024 All rights reserved.

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全常见的问题

1. 什么是 DDoS 攻击?如何防范? 答:DDoS 攻击是指利用大量的计算机或者其他网络设备,同时向目标网络或者服务器 发送 大量的数据流量,以致其无法正常工作,从而导致网络瘫痪或者服务器宕机的攻击行 为。 …

<rust>在rust中,实现32位浮点数与16进制之间的转换

前言 本文是基于rust,对16进制、32位浮点数之间的互相转换的一个简单示例。 环境配置 系统:windows 平台:visual studio code 语言:rust 库:hex 关键依赖 hex"0.4.3"对于字符串与16进制之间的互相转换&am…

pytest日志显示

在 pytest 中,可以通过 钩子函数 和 配置文件 pytest.ini 配置日志的显示方式,实现对日志的灵活控制。以下是常用实现方式及配置说明。 方式一:使用 conftest.py 钩子函数自定义日志显示 通过 conftest.py 文件中的钩子函数,实现…

支持向量机算法(一):像讲故事一样讲明白它的原理及实现奥秘

1、支持向量机算法介绍 支持向量机(Support Vector Machine,SVM)是一种基于统计学习理论的模式识别方法, 属于有监督学习模型,主要用于解决数据分类问题。SVM将每个样本数据表示为空间中的点,使不同类别的…

ES中的仓库和快照

文章目录 简介仓库(Repository)快照(Snapshot)常用命令记录 简介 在Elasticsearch(简称ES)中,仓库(repository)和快照(snapshot)是两种重要的备份…

数据结构与算法之二叉树: LeetCode 108. 将有序数组转换为二叉搜索树 (Ts版)

将有序数组转换为二叉搜索树 https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/description/ 描述 给你一个整数数组 nums ,其中元素已经按 升序 排列请你将其转换为一棵 平衡 二叉搜索树 示例 1 输入:nums [-10,-3,0,5,9…

Neo4j的部署和操作

注:本博文展示部署哥操作步骤和命令,具体报告及运行截图可通过上方免费资源绑定下载 一.数据库的部署与配置 在单个节点上对进行数据库的单机部署 (1)上传neo4j-community-3.5.30-unix.tar.gz到hadoop1的/export/so…

人工智能 前馈神经网络练习题

为了构建一个有两个输入( X 1 X_1 X1​、 X 2 X_2 X2​)和一个输出的单层感知器,并进行分类,我们需要计算权值 w 1 w_1 w1​和 w 2 w_2 w2​的更新过程。以下是详细的步骤和计算过程: 初始化参数 初始权值&#xff1a…

【博主推荐】 Microi吾码开源低代码平台,快速建站,提高开发效率

🍬引言 🍬什么是低代码平台? 低代码平台(Low-Code Platform)是一种使开发人员和业务用户可以通过图形化界面和少量的编程来创建应用程序的开发工具。与传统的编程方式相比,低代码平台大大简化了开发过程&a…

opencv CV_TM_SQDIFF未定义标识符

opencv CV_TM_SQDIFF未定义标识符 opencv4部分命名发生变换,将CV_WINDOW_AUTOSIZE改为WINDOW_AUTOSIZE;CV_TM_SQDIFF_NORMED改为TM_SQDIFF_NORMED。

理解 Tomcat 架构与自定义实现

前言 Tomcat 是一个轻量级的 Web 容器,被广泛应用于 Java Web 开发中。通过它,我们可以轻松地部署和运行 Web 应用。在本文中,我们将深入分析 Tomcat 的核心架构,同时结合一段代码,手动实现一个简化的 Tomcat 服务&am…

Harbor 仓库部署(docker-compose 部署方式)

一、 安装的前提条件 硬件 资源 最低 推荐 cpu2C4C内存4G8G硬盘40G160G 软件 软件 版本 描述 dockerv17.0.6-ce 安装参考官方文档 Install Docker Engine | Docker Documentation docker-composev1.18.0 安装参考官方文档 Overview | Docker Documentation Openssllatest…

使用Llama 3.1创建合成数据集以调优你的大型语言模型

使用Llama 3.1创建合成数据集以调优你的大型语言模型 在数据驱动的人工智能领域,数据是核心资产。开发高质量数据集既复杂又昂贵,因此很多实验室和开发者选择使用合成数据集。本文将介绍如何利用大型语言模型Llama 3.1 405B创建合成数据集,并…

用户界面软件02

基于表单的用户界面 在“基于表单的用户界面”里面,用户开始时选中某个业务处理(模块),然后应用程序就使用一系列的表单来引导用户完成整个处理过程。大型机系统上的大部分用户界面都是这样子的。[Cok97]中有更为详细的讨论。 面…

go如何从入门进阶到高级

针对Go语言的学习,不同阶段应采取不同的学习方式,以达到最佳效果.本文将Go的学习分为入门、实战、进阶三个阶段,下面分别详细介绍 一、社区 Go语言中文网 作为专注于Go语言学习与推广的平台,Go语言中文网为开发者提供了丰富的中…

采用标准化的方式开展设计-研发中运用设计模式

概述 实现规范化、标准化的引导式设计,以业务需求为输入,识别业务特点,并通过引导式设计,找到最适合的设计模式、具体方案,汇总成为应用的设计,拉齐各应用的设计一的致性。 采用标准化的方式开展设计…

Qt之屏幕录制设计(十六)

Qt开发 系列文章 - screencap(十六) 目录 前言 一、实现原理 二、实现方式 1.创建录屏窗口 2.录屏窗口类定义 3.自建容器对象定义 4.用户使用 5.效果演示 总结 前言 利用Qt实现屏幕录制设计,可以通过使用Qt自带的类QScreen、QPixma…

【C语言程序设计——选择结构程序设计】求阶跃函数的值(头歌实践教学平台习题)【合集】

目录😋 任务描述 相关知识 1. 选择结构基本概念 2. 主要语句类型​(if、if-else、switch) 3. 跃迁函数中变量的取值范围 4. 计算阶跃函数的值 编程要求 测试说明 通关代码 测试结果 任务描述 本关任务:输入x的值&#x…

自定义字典转换器用于easyExcel 导入导出

文章目录 引言I 字典转换器、注解、序列化器注解定义自定义字典转换器用于easyExcel 导入导出自定义字典序列化器II 字典存储设计数据库表结构redis缓存引言 需求导入Excel时,根据字典内容或者字段编码转换 导出Excel时,根据字典内容或者字段编码转换 接口响应数据序列化时,…

Mac软件介绍之录屏软件Filmage Screen

软件介绍 Filmage Screen 是一款专业的视频录制和编辑软件,适用于 Mac 系统 可以选择4k 60fps,可以选择录制电脑屏幕,摄像头录制,可以选择区域录制。同时也支持,简单的视频剪辑。 可以同时录制电脑麦克风声音 标准…