全网最适合入门的面向对象编程教程:03 类和对象的Python实现-为自定义类添加属性
扫描二维码
随时随地手机看文章
摘要:
本文主要介绍了,当使用Python创建自定义类时,如何为其添加属性,包括为类和实例添加属性两种,以及如何获取自定义的属性等内容。
正文
类自身可以具有自己的属性,被称为类属性,或者类成员变量。我们可以通过点标记法在不改动类定义的情况下为实例对象设定任意属性:
# 创建一个串口类 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解释器自己会把实例变量传进去。





