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

摘要

本文主要介绍了串口通信协议的基本概念、串口通信的基本流程、如何使用 Python 语言创建一个类和类内成员中属性和方法的定义。

正文

这里开始,我们将以嵌入式中常用的串口通信协议为例,讲解以下知识:

① 如何在 Python 中创建类和对象;

② 如何为 Python 对象添加属性和行为;

③ 如何将类组织成包和模块;

④ 如何限制外部访问私有数据。

在使用 Python 进行编程之前,我们先回想一下平时我们是如何使用串口的。总结来说,无非就是下面几个步骤:

① 首先,我们需要确定要使用的串口号。

② 其次,配置波特率、数据位、奇偶校验位、停止位、DTR/DSR、RTS/CTS 和 XON/XOFF。

③ 第三,打开串口。

④ 第四,收发数据。

⑤ 第五,关闭串口。

接下来,我们就来研究下用 Python 怎么实现面对对象的串口操作。

在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段,由于 Python 是动态语言,类是动态生成的。通过 class 关键字我们可以定义一个新的类型,class 之后为类的名称并以冒号结尾:

_# 类名必须遵循标准的 Python 变量名准则_
_# 必须以字母或下画线开头,并只能由字母、下画线或数字组成_
_# PEP 8标准建议类名应该用驼峰格式:_
_# 以大写字母开头,任意后续单词都以大写字母开头_
class ClassName:
pass

类的定义行后面是类的内容块。和其他的 Python 代码结构一样,类也用缩进而非其他语言常用的大括号或方括号来界定。Python 中尽量用 4 个空格作为缩进。任何好用的代码编辑器都支持将 Tab 键输入替换为 4 个空格。由于示例中第一个类实际上什么都不做,因此我们简单地在第 2 行用 pass 关键字表示下面没有进一步的动作了。

class ClassName:
pass c = ClassName()
print(id(ClassName), type(ClassName), ClassName)
print(id(c), type(c), c)

这里,我们使用 printf 函数输出类和实例的相关信息。需要说明的是,在 Python,所有的数据类型,值,变量,函数,类,实例等等一切可操作的基本单元都使用对象(Object)表示。每个对象有三个基本属性:ID,类型和值,也即有一块内存中存储了一个对象,这块内存中一定存有这三个属性。在以上的输出中,我们可以看到在 Python 中定义一个新类(Class)等于创建了一个新类型(Type)的对象(Object),解释器中一切对象均存储在 PyObject 结构中。

示例中,我们定义了一个自己的类型 ClassName,c 是它的实例(Instance),它的类型是 main.ClassName。Class 和 Type 均是指类型(Type),Class 通常用于普通用户使用 class 自定义的类型。Type 通常指 Python 的解释器 CPython 内置的类型。

<__main__.ClassName object at 0x00000281CFD71190>

指明了当前实例 c 所处内存空间为 0x00000281CFD71190。

这里,我们首先创建一个串口类 SerialClass:

_# 创建一个串口类_
class SerialClass:
pass

但可以看到,我们并没有定义类中任何东西,现在该怎么操作呢,怎么实现一个串口的收发功能呢?对于一个类而言,一般具有两个成员:属性和方法。用来描述具体某个对象的特征的是属性,是静态的,例如串口通信需要设置的一些参数,如波特率、数据位位数等。每个对象有它们自己的行为或者是使用它们的方法,比如串口发送数据、接收数据、设置通信参数等,我们把这些行为称之为方法,是动态的,可以使用这些方法来操作一个对象。

关于如何为我们刚刚创建的串口类添加属性和方法,我们下一节会讲到。

文档和代码获取

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

https://github.com/leezisheng/Doc

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

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

往期推荐:

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

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

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

更多精彩内容可看:

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

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

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

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

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

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

  1. [Java入门笔记] 面向对象编程基础(二):方法详解

    什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能上来看,方法都有点类似与函数.但是,方法与传统的函数还是有着不同之处: 在 ...

  2. 最适合入门的Laravel中级教程(一)

    Laravel 是一个全栈框架: 我们使用 Laravel 开发业务常见有 3 个方向: 前端页面和后端逻辑混合的应用 主要是面向对 SEO 有需求的项目: 比如说新闻资讯博客文章等: 一般在控制器中 ...

  3. Python入门之面向对象编程(一)面向对象概念及优点

    概念 谈到面向对象,很多程序员会抛出三个词:封装.继承和多态:或者说抽象.一切都是对象之类的话,然而这会让初学者更加疑惑.下面我想通过一个小例子来说明一下 面向对象一般是和面向过程做对比的,下面是一个 ...

  4. JavaScript基础入门12 - 面向对象编程

    目录 JavaScript 面向对象编程 前言 构造函数创建对象 instanceof constructor 返回值 原型对象 关于对象的属性查找 in hasOwnProperty() JS当中实 ...

  5. [Java入门笔记] 面向对象编程基础(一):类和对象

    什么是面向对象编程? 我们先来看看几个概念: 面向过程程序设计 面向过程,是根据事情发展的步骤,按进行的顺序过程划分,面向过程其实是最为实际的一种思考方式,可以说面向过程是一种基础的方法,它考虑的是实 ...

  6. Python入门之面向对象编程(四)Python描述器详解

    本文分为如下部分 引言——用@property批量使用的例子来引出描述器的功能 描述器的基本理论及简单实例 描述器的调用机制 描述器的细节 实例方法.静态方法和类方法的描述器原理 property装饰 ...

  7. JavaScript中的面向对象编程,详解原型对象及prototype,constructor,proto,内含面向对象编程详细案例(烟花案例)

    面向对象编程:   面向:以什么为主,基于什么模式 对象:由键值对组成,可以用来描述事物,存储数据的一种数据格式 编程:使用代码解决需求   面向过程编程:         按照我们分析好的步骤,按步 ...

  8. 《Java从入门到失业》第四章:类和对象(4.1):初识类和对象

    4类和对象 在第一章曾经简单介绍过,在面向对象的世界里,一切事物皆对象,当解决一个问题的时候,我们先会考虑这个问题会涉及到哪些事物,然后把事物抽象成类,当时还画了一张图如下: 从本章开始,我们一点一点 ...

  9. 最适合入门的Laravel中级教程(二)用户认证

    之前的初级教程主要是学习简单的增删改查: 接着的中级教程的目标是在初级教程的基础上能写出更复杂更健壮的程序: 我们先来学习 laravel 的用户认证功能: 在现代网站中基本都有用户系统: 而我们每开 ...

  10. [Java入门笔记] 面向对象编程基础(三):成员变量和局部变量

    在类中,变量根据定义的位置不同,可以分为成员变量和局部变量.

随机推荐

  1. SDXL

    SDXL 模型经过训练可以创建具有更好图像质量的更大图像.它们还可以拍摄 512x512 分辨率的优质图像,因此就图像质量而言,它们通常是 SD 1 或 2 型号的良好替代品. 但是,它们确实会消耗更 ...

  2. [COCI2008-2009 #2] PERKET

    传送锚点:https://www.luogu.com.cn/problem/P2036 题目描述 Perket 是一种流行的美食.为了做好 Perket,厨师必须谨慎选择食材,以在保持传统风味的同时尽 ...

  3. ASP.NET Core替换Action实际执行方法

    RequestDelegate 上次,我们在<如何判断当前请求的API类型>中查看endpoints.MapControllers()实现时,最终定位到ActionEndpointFact ...

  4. IPsecVPN 服务器一键安装脚本

    IPsec VPN 服务器一键安装脚本 使用 Linux 脚本一键快速搭建自己的 IPsec VPN 服务器.支持 IPsec/L2TP, Cisco IPsec 和 IKEv2 协议.你只需提供自己 ...

  5. kubernetes ingress网站发布

    ingress网站发布 单域名 # 1.创建nginx pod 名称: nginx-nodeport.yaml cat nginx-nodeport.yaml apiVersion: v1 kind: ...

  6. golang import 导入的四种方式

    1 标准导入: import "package_name" 2 导入别名: import ( alias "package_name" ) 3 匿名导入: _ ...

  7. 微信iOS消息拦截插件教程-第一个tweak编译过程

    -安装好theos框架之后,下面用一个简单的例子进行说明编译过程 -新建一个代码目录 -进入terminal,cd到刚才的目录中 1.进入目录 2.执行/opt/theos/bin/nic.pl 3. ...

  8. itest(爱测试) 4.5.7 发布,开源BUG 跟踪管理 & 敏捷测试管理&极简项目管理软件

    itest 简介 itest 开源敏捷测试管理,testOps 践行者,极简的任务管理,测试管理,缺陷管理,测试环境管理,接口测试5合1,又有丰富的统计分析.可按测试包分配测试用例执行,也可建测试迭代 ...

  9. BLP 模型

    公号:Rand_cs BLP 模型 本篇文章是调研了许多资料后对 BLP 模型的一个总结 MLS,Multi-level Security,主要关心的是数据机密性 D. Elliott Bell 和 ...

  10. zabbix如何监控服务器

    1.zabbix架构图 zabbix核心概念 先记住如下zabbix中的核心几个概念 主机 ( HOST ) : 就是具体的一个监控对象,某一个被监控的实例,可以是一个数据库,也可以是一个操作系统. ...