全网最适合入门的面向对象编程教程:06 类和对象的Python实现-自定义类的数据封装

全网最适合入门的面向对象编程教程:06 类和对象的 Python 实现-自定义类的数据封装

摘要:

本文我们主要介绍了数据封装的基本概念和特性,如何设置自定义类的私有属性和私有方法,protect 属性的概念和特点。

往期推荐:

学嵌入式的你,还不会面向对象??!

全网最适合入门的面向对象编程教程:00 面向对象设计方法导论

全网最适合入门的面向对象编程教程:01 面向对象编程的基本概念

全网最适合入门的面向对象编程教程:02 类和对象的 Python 实现-使用 Python 创建类

全网最适合入门的面向对象编程教程:03 类和对象的 Python 实现-为自定义类添加属性

全网最适合入门的面向对象编程教程:04 类和对象的Python实现-为自定义类添加方法

全网最适合入门的面向对象编程教程:05 类和对象的Python实现-PyCharm代码标签

更多精彩内容可看:

给你的 Python 加加速:一文速通 Python 并行计算

一文搞懂 CM3 单片机调试原理

肝了半个月,嵌入式技术栈大汇总出炉

电子计算机类比赛的“武林秘籍”

一个MicroPython的开源项目集锦:awesome-micropython,包含各个方面的Micropython工具库

文档和代码获取

可访问如下链接进行对文档下载:

FreakStudio-Python面向对象文档

image

本文档主要介绍如何使用 Python 进行面向对象编程,需要读者对 Python 语法和单片机开发具有基本了解。相比其他讲解 Python 面向对象编程的博客或书籍而言,本文档更加详细、侧重于嵌入式上位机应用,以上位机和下位机的常见串口数据收发、数据处理、动态图绘制等为应用实例,同时使用 Sourcetrail 代码软件对代码进行可视化阅读便于读者理解。

相关示例代码获取链接如下:
FreakStudio-Python面向对象示例代码

正文

面向对象编程的一个重要特点就是数据封装。在上面的 SerialClass 类中,有关于串口波特率、设备名称等多个属性,我们编写代码的过程中,往往不希望别的模块可以直接访问本模块的数据,而仅通过调用我们的接口函数来访问数据,也就是高内聚和低耦合原则。

在 Python 中,我们可以通过给属性或方法命名时可以用两个下划线作为开头来改变属性和方法的访问权限。在 Python 中,属性和方法的访问权限只有两种,也就是公开的和私有的,对于私有属性或私有方法来说,是不允许外界访问的。

  • (1)类的私有属性格式:__private_attrs 两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时__private_attrs。
  • (2)类的私有方法格式:__private_method:两个下划线开头,声明该方法为私有方法,不能在类的外部调用。在类的内部调用 self.__private_methods。

这里,我们联系上一节中串口收发的相关方法,可以看到在使用串口收发的相关方法时,我们并没有判断当前串口的状态,如果串口状态为关闭,那么就不能正常工作。于是我们添加了一个__devstate 私有属性用于标识串口状态,同时添加了 RetSerialState()方法用于外界获取串口状态,示例代码如下:

import serial
import serial.tools.list_portsclass SerialClass:_# 初始化__# 使用默认参数_def __init__(self,devport = "COM17",devbaudrate = 115200,devbytesize = serial.EIGHTBITS,devparity = serial.PARITY_NONE,devstopbits = serial.STOPBITS_ONE):_# 直接传入serial.Serial()类_self.dev             = serial.Serial()self.dev.port        = devportself.dev.baudrate    = devbaudrateself.dev.bytesize    = devbytesizeself.dev.parity      = devparityself.dev.stopbits    = devstopbits_# 表示串口设备的状态-打开或者关闭__# 初始化时为关闭_self.__devstate      = False_# 打开串口_def OpenSerial(self):self.dev.open()self.__devstate = True_# 关闭串口_def CloseSerial(self):self.dev.close()self.__devstate = False_# 串口读取_def ReadSerial(self):if self.__devstate:_# 非阻塞方式读取__# 按行读取_data = self.dev.readline()_# 收到为二进制数据__# 用utf-8编码将二进制数据解码为unicode字符串__# 字符串转为int类型_data = int(data.decode('utf-8', 'replace'))return data_# 串口写入_def WriteSerial(self,write_data):if self.__devstate:_# 非阻塞方式写入_self.dev.write(write_data.encode())_# 输出换行符__# write的输入参数必须是bytes 格式__# 字符串数据需要encode()函数将其编码为二进制数据,然后才可以顺利发送__# \r\n表示换行回车_self.dev.write('\r\n'.encode())def RetSerialState(self):if self.dev.isOpen():self.__devstate = Truereturn Trueelse:self.__devstate = Falsereturn False_# 生成串口类的实例_
serdev = SerialClass()print("serdev state :",serdev.RetSerialState())
serdev.OpenSerial()
print("serdev state :",serdev.RetSerialState())
serdev.CloseSerial()
print("serdev state :",serdev.RetSerialState())
print(serdev.__devstate)

这里我们在初始化方法中使用了默认参数,即在定义方法时,直接给形式参数指定一个默认值,这样的话,即便初始化时没有给拥有默认值的形参传递参数,该参数可以直接使用定义函数时设置的默认值。

代码运行结果如下,可以看到在打开或关闭串口设备时,RetSerialState()方法可以正常获取串口状态,而当我们访问类内私有属性时,程序报错:

image

好的,现在我们终于松了一口气,声明__devstate 为私有属性后,外部终于无法访问我们的数据了。但是真的是这样吗?

尝试将:

print(serdev.__devstate)

修改为:

print(serdev._SerialClass__devstate)

此时,我们运行程序,发现代码输出如下:

image

坏了,怎么外界还能访问我们类内私有属性?这是什么魔法?

这是 Python 的名字改装在起作用。Python 不允许实例化的类访问私有数据,但你可以使用 object._className__attrName( 对象名._类名__私有属性名 )访问属性。

由此可知,在 Python 中私有属性为假私有属性。那为什么不从语法上保证 private 字段的私密性呢?用最简单的一句话来说:We are all consenting adults here(我们都是成年人)。正如 Python 程序员的观点:开放要比封闭好。

通过以上讲解,我们实际上已经对类的封装特性有所了解,所谓封装就是:

"隐藏一切可以隐藏的实现细节,只向外界暴露(提供)简单的编程接口"。我们在类中定义的方法其实就是把数据和对数据的操作封装起来了,在我们创建了对象之后,只需要给对象发送一个消息(调用方法)就可以执行方法中的代码,也就是说我们只需要知道方法的名字和传入的参数(方法的外部视图),而不需要知道方法内部的实现细节(方法的内部视图)。

对于类的私有属性来说,子类是无法访问的,私有变量只有本类的内部能直接调用。这时我们可以用 protect 属性进行修改,在属性和方法前加一个下划线就是 protect 类型了。类的 protect 属性,子类可以继承,同时实例对象、类对象都能直接调用 protect 属性、方法。
受保护属性在类的外部是可见但不建议直接访问,其命名约定表示它们是内部实现的一部分,不应该被直接访问。总体而言,Python 强调封装性,鼓励使用公共方法来访问和修改属性,而不是直接在外部访问。这种做法有助于提高代码的可维护性,防止意外的修改和增加代码的灵活性。

image

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

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

相关文章

MOS管

MOS管 MOS 管是金属-氧化物半导体场效应晶体管的缩写,是一种重要的半导体器件。它具有以下特点和应用:特点:高输入阻抗:MOS 管的输入阻抗很高,可以减少对前级电路的影响。 开关速度快:MOS 管的导通和截止速度很快,适用于高频电路。 噪声低:MOS 管的噪声较低,适用于对噪…

三极管的作用和原理

目录 目录三极管的类型、作用和工作原理三极管的作用NPN三极管结构和工作原理:PNP三极管结构和工作原理:区别和应用场景三极管的类型、作用和工作原理三极管是一种重要的半导体器件,主要有两种类型:NPN和PNP。它们在结构、工作原理和应用上有显著的区别。三极管的作用 三极…

【Oracle】匹配一个字符中是否存在空格以及回车

【Oracle】匹配一个字符中是否存在空格以及回车 使用REGEXP_LIKE,然后使用[[:space:]] [[:space:]] 是一个 POSIX 字符类,匹配任何空白字符,包括空格、制表符、回车和换行 例子如下 SELECT R1, R2 FROM dual WHERE REGEXP_LIKE(R1, R2, [[:space:]]);您能读到这儿,我呢是发…

[淘宝/天猫/1688/京东]API接口数据采集分享

主流电商平台大数据采集API接口。在当今时代,从数据中挖掘价值的重要性愈发凸显,远超以往任何时期。现代企业渴望在任意设备上,无论身处何地,都能实时获取最新的相关信息。这正是数字化转型的核心所在,它同样适用于供应链的每一个环节。在当今时代,从数据中挖掘价值的重要…

@RequestMapping中的name属性解释

在Spring MVC中,@RequestMapping注解用于映射web请求到特定的处理方法。这个注解有多个属性,其中之一就是name。name属性通常用于为映射提供一个名称,这个名称可以在日志、文档或其他需要引用这个映射的地方使用。 在Spring MVC的上下文中,这允许你为特定的@RequestMapping…

6种Win10关闭自动更新方法介绍!

Win10自动更新 想寻找Win10关闭自动更新方法?Windows 10自动更新功能旨在确保您的系统始终运行最新的安全补丁和功能更新。然而,对于某些用户来说,频繁的更新可能带来不便。有时选择拒绝更新,系统会一直不停的提示系统更新;选择更新了,更新后一些软件或网络打印机等相关设…

【动画进阶】类 ChatGpt 多行文本打字效果

今天我们来学习一个有意思的多行文本输入打字效果,像是这样:这个效果其实本身并非特别困难,实现的方式也很多,在本文中,我们更多的会聚焦于整个多行打字效果最后的动态光标的实现。 也就是如何在文本不断变长,在不确定行数的情况下,让文字的最末行右侧处,一直有一个不断…

解决卡顿发热,超帧技术焕发中重载游戏动力

近几年,中国手游市场规模不断扩大,开发者通过在画面、玩法等方面的持续创新和打磨,推出更加精品化的产品。然而愈发精美的画质和复杂的玩法,也给硬件带来超高的负载,导致玩家在游戏过程中,频繁出现掉帧卡顿、发烫、续航差等体验降低的现象。HarmonyOS SDK 图形加速服务(…

ArchiMate 3 学习

目录ArchiMate 3 学习什么是ArchiMateArchiMate 3.1 规范关系动机元素策略元素业务层应用层技术层物理元素实施和迁移元素复合元素 ArchiMate 3 学习 ArchiMate 3 中文版 什么是ArchiMate ArchiMate 是 The Open Group 为企业架构提供的开放和独立的建模语言,由不同的工具供应…

如何找到并快速上手一个开源项目

以前有写过两篇文章来简单聊过如何做开源的事情,最近我自己组了一个社区里面也有不少朋友对开源感兴趣,于是我便根据自己的经验系统的梳理了一些关于开源的事情。新手如何快速参与开源项目 手把手教你为开源项目贡献代码有兴趣的可以先看看之前这两篇。🔎如何找到自己感兴趣…

WPF在.NET9中的重大更新:Windows 11 主题

WPF在.NET9中的重大更新:Windows 11 主题在2023年的2月20日,在WPF的讨论区,WPF团队对路线的优先级发起了一次讨论。对三个事项发起了投票。 第一个是Windows 11 主题第二个是更新的控件第三个是可空性注释最终Windows 11 主题得票最高,WPF团队2023-2024的工作优先级就是Win…

配置 Swagger + 注释

打开Xml文件生成,右键项目进入属性设置: 取消未进行注释而进行提示的警告: 然后Program.cs增加代码: 代码:builder.Services.AddSwaggerGen(s => {//获取xml文件名称var xmlFileName = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";//包含注释,…

C#winform如何在窗体实现视频播放

1.在Form窗体设计中的左侧工具箱列表中右击鼠标,单击选择项。2.在弹出的对话框中点击COM组件,选择Windows Media Player,点击确定3.接着在工具箱选择Windows Media Player控件,将控件添加到窗体中,并且添加一个OpenFileDialog控件4.接着在工具箱的对话框中将OpenFileDialog…

AI引导学习前端开发

假设你是一位前端技术开发专家,我有几个JavaScript的问题想向你咨询 我想用JavaScript来做微信小程序开发,请以表格的方式输出知识要点 请叙述JavaScript操作浏览器对象的常用接口和方法 把上述表格按照访问对象归类 将上述文字制作一个表格来呈现,要求逻辑清晰描述信息简明…

Codeforces Round 894 (Div. 3) A-E cd 894 div3

A. Gift Carpet 每道题都是伸缩代码框有ac代码请不要漏掉 --------------------------题解----------------------------- 按先行便然后列再变循环 设置jud每满足一个条件就让jud++ 只有jud==相应值的时候才让其++点击查看代码 #include<bits/stdc++.h> using namespace …

网络隔离后 用这种安全U盘可实现数据安全传输

在网络隔离的环境下,尤其是物理隔离环境下,使用安全U盘进行数据传输可以被视为一种安全的方法。不过前提是要确保以下几点: 1、来源可信性:确保U盘的来源是可信的,没有被感染或篡改过的风险。最好使用自己的U盘,或者来自于安全可靠的来源。 2、扫描病毒:在使用U盘之前,…

AI引到学习前端开发

假设你是一位前端技术开发专家,我有几个JavaScript的问题想向你咨询 我想用JavaScript来做微信小程序开发,请以表格的方式输出知识要点 请叙述JavaScript操作浏览器对象的常用接口和方法 把上述表格按照访问对象归类 将上述文字制作一个表格来呈现,要求逻辑清晰描述信息简明…

U-KAN环境搭建推理测试

​引子 U-Net的鼎鼎大名,我觉得无需我多言了。图像分割和扩散概率模型的基石。作者探索了KANs在改进视觉任务 Backbone 网络方面的未开发潜力。作者研究、修改并重新设计已建立的U-Net Pipeline ,通过在标记化的中间表示上整合专用的KAN层,称之为U-KAN。严格的医学图像分割基…

飞驰云联Ftrans数据安全摆渡系统有哪些优点?

数据安全摆渡系统通常是指一种专门设计用来在网络隔离环境下,安全传输数据的系统或服务,通常被那些需要在不同系统、网络或地理位置之间安全传输敏感数据的企业和组织广泛使用。以下是一些主要应用数据安全摆渡系统的企业类型: 金融服务机构:银行、证券公司、保险公司等需要…