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

摘要:

本文主要介绍了,当使用 Python 创建自定义类时,如何为其添加属性,包括为类和实例添加属性两种,以及如何获取自定义的属性等内容。

往期推荐:

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

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

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

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

更多精彩内容可看:

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

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

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

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

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

文档和代码获取

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

https://github.com/leezisheng/Doc

image

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

相关示例代码获取链接如下:https://github.com/leezisheng/Python-OOP-Demo

正文

类自身可以具有自己的属性,被称为类属性,或者类成员变量。我们可以通过点标记法在不改动类定义的情况下为实例对象设定任意属性:

_# 创建一个串口类_
class SerialClass:pass_# 生成串口类的实例_
serdev = SerialClass()
_# 添加属性-串口设备名_
serdev.devport      = "COM17"
_# 添加属性-波特率_
serdev.devbaudrate  = 115200
_# 添加属性-数据位_
serdev.devbytesize  = 8
_# 添加属性-校验位_
serdev.devparity    = 0
_# 添加属性-停止位_
serdev.devstopbits  = 1
_# __dict__可以动态的获取到对象的全部属性_
print(serdev.__dict__)

以上代码创建了一个空的 SerialClass 类,没有任何数据或行为。然后创建了这个类的两个实例并分别赋予它们串口设备名、波特率、数据位等串口相关的属性并赋值。

为对象属性赋值的语法是 < 对象.< 属性=< 值 >

这种方法被称为点标记法(dot notation)。这里的值可以是任何类型:Python 的基本类型、内置数据类型或者其他的对象,甚至可以是一个函数或另一个类!

最后通过__dict__,就可以动态的获取到对象的全部属性,__dict__返回一个字典,属性名是字典的 key,属性值是字典的 value。

我们也可以对类属性赋值,方法同上,代码如下:

_# 创建一个串口类_
class SerialClass:pass_# 添加属性-串口设备名_
SerialClass.devport      = "COM17"
_# 添加属性-波特率_
SerialClass.devbaudrate  = 115200
_# 添加属性-数据位_
SerialClass.devbytesize  = 8
_# 添加属性-校验位_
SerialClass.devparity    = 0
_# 添加属性-停止位_
SerialClass.devstopbits  = 1
_# __dict__可以动态的获取到对象的全部属性_
print(SerialClass.__dict__)_# 生成串口类的实例_
serdev = SerialClass()
print(serdev.devport)
print(serdev.devbaudrate)
print(serdev.devbytesize)
print(serdev.devparity)
print(serdev.devstopbits)

image

可以看到,对类属性赋予新的值,它的所有实例的类属性也会更新。实际上,类属性在创建实例时并不会被单独创建,都是引用的类的属性,它们在内存中只有一份。

同样我们可以通过实例来改变类属性,此时将进行拷贝动作,该实例的类属性将脱离类的属性,实现了属性的解绑定,把原来类属性覆盖了,该属性成为了实例的私有属性,其他实例不会受影响

serdev.devport = "COM15"
print(serdev.devport)
print(SerialClass.devport)

image

在实际的使用时,类属性应该只用于类相关的描述,类示例可以访问和使用它们,但不应该更改它们。

由于类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去。通过定义一个特殊的__init__方法,在创建实例的时候,就把 devport,devbaudrate 等属性绑上去:

_# 创建一个串口类_
class SerialClass:_# 注意:特殊方法“__init__”前后分别有两个下划线!!!_def __init__(self,port,baudrate,bytesize,parity,stopbits):self.devport        = portself.devbaudrate    = baudrateself.devbytesize    = bytesizeself.devparity      = parityself.devstopbits    = stopbits_# 生成串口类的实例_
serdev = SerialClass(port     = "COM17",baudrate = 115200,bytesize = 8,parity   = 0,stopbits = 1)

init 方法的第一个参数永远是 self,表示创建的实例本身,因此,在 init 方法内部,就可以把各种属性绑定到 self,因为 self 就指向创建的实例本身。有了 init 方法,在创建实例的时候,就不能传入空的参数了,必须传入与 init 方法匹配的参数,但 self 不需要传,Python 解释器自己会把实例变量传进去。
image

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

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

相关文章

Centos7下安装配置MySQL5.7

本次安装的版本是在Centos7.6版本下安装配置mysql5.7版本。具体操作步骤如下: 1. 首先通过wget命令,下载MySQL源安装包: wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm 安装MySQL源: yum localinstall mysql57-community-release-el7-11.noar…

Hugging Face Accelerate 两个后端的故事:FSDP 与 DeepSpeed

社区中有两个流行的 零冗余优化器(Zero Redundancy Optimizer,ZeRO) 算法实现,一个来自 DeepSpeed,另一个来自 PyTorch。Hugging Face Accelerate 对这两者都进行了集成并通过接口暴露出来,以供最终用户在训练/微调模型时自主选择其中之一。本文重点介绍了 Accelerate 对…

自制键盘(一)

概述 这个项目的灵感来源是稚晖君的客制化键盘项目,看到瀚文就觉得很震撼,就想自己也做一把试试。正好最近也正好在学嵌入式,顺便巩固一下最近所学的知识、也可以多了解一点技术栈。不过由于技术首先所以先做一把小键盘试试手。 项目整体思路 整个项目大致可以分为三个部分,…

尝试使用 Python 截屏并录屏

( 本文的完整版地址在 https://www.ccgxk.com/?post=494 ) 我在去年,曾经尝试过一个大胆的东西,就是使用 Python 写了个程序来录屏,以此给自己一种“期待感”,当时有没有效果我忘了,但是现在我又将这个项目捡了起来。界面是长上面那个样子,集成了项目名设置、开始录…

Compose 延迟列表踩过的坑

问题 在使用 Jetpack Compose 延迟列表时遇到一个坑,简单记录一下。直接上代码:这个代码看起来也没有什么问题,滑动正常,点击滑动到顶部也正常。 但是极端操作:在一边滑动列表一边点击按钮,就出问题了。这样再点击按钮,就不生效了。从日志来看,点击时协程发射值没有问题…

代码随想录算法训练营第22天 | 77.组合 216.组合总和 17.电话号码的字母组合

77.组合 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。 解题 只能取比它大的,所以有个参数startindex 参数:一维数组单个组合path,二维数组结果集result,总数n,组合大小k,搜索结果的开始索引startindex 终止条件:path.size=k点击查看代码 class Solut…

(四)详解RLHF

一直都特别好奇大模型的强化学习微调是怎么做的,网上虽然相关文章不少,但找到的文章都是浅尝辄止说到用PPO训练,再细致深入的就没有讲了。。。只能自己看一看代码,以前搞过一点用PPO做游戏,感觉和语言模型PPO的用法不太一样。在游戏场景,每个step给环境一个action之后,a…

模拟集成电路设计系列博客——8.1.1 锁相环基本介绍

8.1.1 锁相环基本介绍 几乎所有的数字,射频电路以及大部分的模拟电路。不幸的是,集成电路振荡器本身并不适合用于高性能电路中的频率/时间参考源。一个主要的问题是它们的震荡频率并不能精确知道。更进一步的,集成电路振荡器的时钟抖动(可以被认为是频率上的随机波动)对于…

(三)使用 PPO 算法进行 RLHF 的 N 步实现细节

使用 PPO 算法进行 RLHF 的 N 步实现细节 当下,RLHF/ChatGPT 已经变成了一个非常流行的话题。我们正在致力于更多有关 RLHF 的研究,这篇博客尝试复现 OpenAI 在 2019 年开源的原始 RLHF 代码库,其仓库位置位于 openai/lm-human-preferences。尽管它具有 “tensorflow-1.x” …

JMeter安装目录简单说明

一 前言 环境: window 10 JMeter5.3 JMeter安装目录的文件通常容易被忽略,注意力全放在JMeter本身的各个功能的使用上。 但在前面的学习中我们发现了熟悉安装目录的必要性。 如jmeter.properties这个文件,之前的文章中就经常查看或者修改,还有一些日志文件也在安装目录中 二…

G61【模板】线性基 P3812 线性基

视频链接: G23 线性方程组 高斯消元法 - 董晓 - 博客园 (cnblogs.com) P3812 【模板】线性基 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)// 线性基 O(63*n) #include <iostream> #include <cstring> #include <algorithm> using namespace std;typede…

寿司

寿司 题目描述解析 合法的结果只有两种情况:\(B\) 都在两边、\(R\) 都在两边,至于是最左边还是最右边或者都有,无所谓,因为是环。 而每个 \(B\) 移到最左边的代价就是它左边 \(R\) 的个数,移到最右边就是它右边 \(R\) 的个数。 按环形 dp 的套路,我们可以把串复制二倍,然…

(一)ChatGPT 背后的“功臣”——RLHF 技术详解

ChatGPT 背后的“功臣”——RLHF 技术详解 OpenAI 推出的 ChatGPT 对话模型掀起了新的 AI 热潮,它面对多种多样的问题对答如流,似乎已经打破了机器和人的边界。这一工作的背后是大型语言模型 (Large Language Model,LLM) 生成领域的新训练范式:RLHF (Reinforcement Learnin…

Jetpack Compose(8)——嵌套滚动

目录前言一、Jetpack Compose 中处理嵌套滚动的思想二、Modifier.nestedScroll2.1 NestedScrollConnection2.2 NestedScrollDispatcher三、实操讲解3.1 父组件消费子组件给过来的事件——NestedScrollConnection3.2 子组件对事件进行分发——NestedScrollDispatcher3.2 按照分发…

Unity Address Asset System:Assembly-CSharp - 可用Assembly-CSharp.Player - 不可用

在使用Unity的Addressables插件进行游戏资源分包管理的时候,报了这个错误: 反编译查看发现是unity与.net版本不匹配导致的问题 解决方案: 在Unity中打开Edit->Project Settings->Player,更改.Net版本 微软官方文档: 在 Unity 中使用 .NET 4 和更高版本 | Microsoft …

CC2分析与利用

CC2分析与利用 环境配置 一、 CC2 需要使用commons-collections-4.0版本,因为3.1-3.2.1版本中TransformingComparator没有实现Serializable接口,不能被序列化,所以CC2不用3.x版本。还需要 javassist 依赖,利用链2需要。 pom.xml 添加:<dependency><groupId>or…

【计算机网络】TCP连接三次握手和四次挥手

三次握手建立连接 TCP(传输控制协议)的三次握手机制是一种用于在两个 TCP 主机之间建立一个可靠的连接的过程。这个机制确保了两端的通信是同步的,并且在数据传输开始前,双方都准备好了进行通信。①、第一次握手:SYN(最开始都是 CLOSE,之后服务器进入 LISTEN)发起连接:…

原型设计

原型设计的重要性 网页原型显示了网页的骨架结构,因此可以更好地了解用户将去哪里以及如何导航,通过视觉方式表达产品的要求。 网页原型还有助于交流想法和规划网页,提高团队沟通的效率和质量,进行高效协作。 设计团队与客户沟通变得容易,能够有效地减少了返工和误解,降低…

weblogic 漏洞复现

1.环境地址信息http://192.168.116.112:7001/console/ 2.使用漏洞检测工具,检测对应漏洞 选中对应漏洞检查,发现存在对应漏洞 3.漏洞利用 命令执行 内存马上传使用冰蝎连接 连接成功