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

来源:Freak嵌入式 嵌入式技术 18 次阅读
摘要:摘要: 本文主要介绍了,当使用Python创建自定义类时,如何为其添加属性,包括为类和实例添加属性两种,以及如何获取自定义的属性等内容。 往期推荐: 学嵌入式的你,还不会面向对象??! 全网最适合入门的面向对象编程教程:00 面向对象设计方法导论 全网最适合入门的面向对象编程教程:01 面向对象编程的基本概念 全网最适合入门的面向对象编程教程:02 类和对象的Python实现-使用Python创

摘要:

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

往期推荐:

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

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

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

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

正文

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

*# 创建一个串口类*
classSerialClass:
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。

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

*# 创建一个串口类*
classSerialClass:
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等属性绑上去:

*# 创建一个串口类*
classSerialClass:
*# 注意:特殊方法“__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解释器自己会把实例变量传进去。

更多精彩内容可看:

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

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

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

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

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

相关推荐
评论区

登录后即可参与讨论

立即登录