全网最适合入门的面向对象编程教程:03 类和对象的Python实现-为自定义类添加属性
摘要:
本文主要介绍了,当使用 Python 创建自定义类时,如何为其添加属性,包括为类和实例添加属性两种,以及如何获取自定义的属性等内容。
往期推荐:
全网最适合入门的面向对象编程教程:00 面向对象设计方法导论
全网最适合入门的面向对象编程教程:01 面向对象编程的基本概念
全网最适合入门的面向对象编程教程:02 类和对象的 Python 实现-使用 Python 创建类
更多精彩内容可看:
给你的 Python 加加速:一文速通 Python 并行计算
一个MicroPython的开源项目集锦:awesome-micropython,包含各个方面的Micropython工具库
文档和代码获取
可访问如下链接进行对文档下载:
https://github.com/leezisheng/Doc

本文档主要介绍如何使用 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)

可以看到,对类属性赋予新的值,它的所有实例的类属性也会更新。实际上,类属性在创建实例时并不会被单独创建,都是引用的类的属性,它们在内存中只有一份。
同样我们可以通过实例来改变类属性,此时将进行拷贝动作,该实例的类属性将脱离类的属性,实现了属性的解绑定,把原来类属性覆盖了,该属性成为了实例的私有属性,其他实例不会受影响。
serdev.devport = "COM15"
print(serdev.devport)
print(SerialClass.devport)

在实际的使用时,类属性应该只用于类相关的描述,类示例可以访问和使用它们,但不应该更改它们。
由于类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去。通过定义一个特殊的__init__方法,在创建实例的时候,就把 devport,devbaudrate 等属性绑上去:
_# 创建一个串口类_
class SerialClass:
    _# 注意:特殊方法“__init__”前后分别有两个下划线!!!_
    def __init__(self,port,baudrate,bytesize,parity,stopbits):
        self.devport        = port
        self.devbaudrate    = baudrate
        self.devbytesize    = bytesize
        self.devparity      = parity
        self.devstopbits    = stopbits
_# 生成串口类的实例_
serdev = SerialClass(port     = "COM17",
                     baudrate = 115200,
                     bytesize = 8,
                     parity   = 0,
                     stopbits = 1
                    )
init 方法的第一个参数永远是 self,表示创建的实例本身,因此,在 init 方法内部,就可以把各种属性绑定到 self,因为 self 就指向创建的实例本身。有了 init 方法,在创建实例的时候,就不能传入空的参数了,必须传入与 init 方法匹配的参数,但 self 不需要传,Python 解释器自己会把实例变量传进去。

全网最适合入门的面向对象编程教程:03 类和对象的Python实现-为自定义类添加属性的更多相关文章
- [Java入门笔记] 面向对象编程基础(二):方法详解
		
什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能上来看,方法都有点类似与函数.但是,方法与传统的函数还是有着不同之处: 在 ...
 - 最适合入门的Laravel中级教程(一)
		
Laravel 是一个全栈框架: 我们使用 Laravel 开发业务常见有 3 个方向: 前端页面和后端逻辑混合的应用 主要是面向对 SEO 有需求的项目: 比如说新闻资讯博客文章等: 一般在控制器中 ...
 - Python入门之面向对象编程(一)面向对象概念及优点
		
概念 谈到面向对象,很多程序员会抛出三个词:封装.继承和多态:或者说抽象.一切都是对象之类的话,然而这会让初学者更加疑惑.下面我想通过一个小例子来说明一下 面向对象一般是和面向过程做对比的,下面是一个 ...
 - JavaScript基础入门12 - 面向对象编程
		
目录 JavaScript 面向对象编程 前言 构造函数创建对象 instanceof constructor 返回值 原型对象 关于对象的属性查找 in hasOwnProperty() JS当中实 ...
 - [Java入门笔记] 面向对象编程基础(一):类和对象
		
什么是面向对象编程? 我们先来看看几个概念: 面向过程程序设计 面向过程,是根据事情发展的步骤,按进行的顺序过程划分,面向过程其实是最为实际的一种思考方式,可以说面向过程是一种基础的方法,它考虑的是实 ...
 - Python入门之面向对象编程(四)Python描述器详解
		
本文分为如下部分 引言——用@property批量使用的例子来引出描述器的功能 描述器的基本理论及简单实例 描述器的调用机制 描述器的细节 实例方法.静态方法和类方法的描述器原理 property装饰 ...
 - 一.OC基础之:1,OC语言的前世今生 ,2,OC语言入门,3,OC语言与C的差异,4,面向对象,5,类和对象的抽象关系,6,类的代码创建,7,类的成员组成及访问
		
1,OC语言的前世今生 , 一, 在20世纪80年代早期,布莱德.麦克(Brad Cox)设计了OC语言,它在C语言的基础上增加了一层,这意味着对C进行了扩展,从而创造出一门新的程序设计语言,支持对象 ...
 - PythonI/O进阶学习笔记_3.2面向对象编程_python的继承(多继承/super/MRO/抽象基类/mixin模式)
		
前言: 本篇相关内容分为3篇多态.继承.封装,这篇为第二篇 继承. 本篇内容围绕 python基础教程这段: 在面向对象编程中,术语对象大致意味着一系列数据(属性)以及一套访问和操作这些数据的方法.使 ...
 - JavaScript中的面向对象编程,详解原型对象及prototype,constructor,proto,内含面向对象编程详细案例(烟花案例)
		
面向对象编程: 面向:以什么为主,基于什么模式 对象:由键值对组成,可以用来描述事物,存储数据的一种数据格式 编程:使用代码解决需求 面向过程编程: 按照我们分析好的步骤,按步 ...
 - 1.面向过程编程 2.面向对象编程 3.类和对象 4.python 创建类和对象 如何使用对象 5.属性的查找顺序 6.初始化函数 7.绑定方法 与非绑定方法
		
1.面向过程编程 面向过程:一种编程思想在编写代码时 要时刻想着过程这个两个字过程指的是什么? 解决问题的步骤 流程,即第一步干什么 第二步干什么,其目的是将一个复杂的问题,拆分为若干的小的问题,按照 ...
 
随机推荐
- java学习之旅(day.06)
			
switch多选择结构 多选择结构还有一个实现方式就是switch case switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支 switch(expression ...
 - ssl协议存在弱加密算法修复,禁用低版本的TLS
			
验证用网站:https://www.ssleye.com/ssltool/cipher_suites.html https://www.site24x7.com/zhcn/tools/tls-chec ...
 - 热更学习笔记10~11----lua调用C#中的List和Dictionary、拓展类中的方法
			
[10]Lua脚本调用C#中的List和Dictionary 调用还是在上文中使用的C#脚本中Student类: lua脚本: print("------------访问使用C#脚本中的Li ...
 - vue3:modal组件开发
			
项目环境 @vue/cli 4.5.8 最终效果 需求分析 显示/隐藏 点击遮罩层能否关闭 宽度和zIndex自定义 标题栏 -显示标题和关闭按钮 主体 底部 -内置取消和确定功能 前置知识 tele ...
 - 解决“在windows里的记事本里编辑的汉字文本文件,上传到linux服务器上出现乱码“问题
			
目录 一.前期准备 二.编码转换 一.前期准备 1.首先在windows环境下打开记事本,然后创建一个包含汉字和英文的文本文件,输入内容"测试在windows里的记事本里编辑的文本文 件,上 ...
 - linux分区规划
			
一般来说,对系统进行分区,需要提前规划好:  系统分区:如果资源允许的话,建议300G(该分区只存放操作系统和一些配置文件等):  /boot分区:是引导分区(该分区损坏,系统就启动不了了),在b ...
 - 实战-mongodb副本集搭建以及整合springboot使用
			
一 mongodb介绍 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. Nosql 技术门类 redis 内存型 mongod ...
 - Vue  Vue-Router params 传参 为空 path定义参数 参数 param is not repeatable
			
我在Vue-Router4.0.3版本上出现这个问题 因为官方 在2022年8月22日时废除了未定义的传参方式,所以必须使用定义的params. 解决办法: 在配置路由时:path路径上带上传值的ke ...
 - C# 调用 qrencode的动态库
			
自己根据qrencode的源码导了一个dll动态库,见: https://www.cnblogs.com/HelloQLQ/p/16364825.html 自己希望能用C#语言调用以下. 首先构建需要 ...
 - c# 获得变量名称
			
string GetVariableName<T>(Expression<Func<T>> expr) { var body = ...