摘要:
本文主要介绍了,当使用 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 解释器自己会把实例变量传进去。
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容