Python 测开27期 - WL - 学习笔记 - python数据类dataclass

python数据类dataclass

优势

  • 可读性强
  • 操作灵活
  • 轻量
  • 应用场景
    ** 创建对象
    ** 完美融合平台开发ORM框架

参考实例。实现方案

  • 使用dataclass创建数据类
  • 实例化的时候自动生成构造函数
    ** 案例
'''
案例
场景:如果创建一只猫,信息包括猫的名字,体重,颜色,同时打印这个对象的时候,洗碗能打印出一个字符串(包含猫的各种信息),应该如何编码
问题:
数据修改不方便
代码冗余
解决方案:
使用自定义类实现数据类
'''

** 原码

class Cat:
    name : str
    color : str
    weihgt : int

    def __init__(self,name,color,weihgt):
        self.name = name
        self.color = color
        self.weihgt = weihgt
    def __str__(self):
        return f"猫名字:{self.name},年龄:{self.weihgt}, 颜色:{self.color}"
    def __repr__(self):
        return f"===>>>>>猫名字:{self.name},年龄:{self.weihgt}, 颜色:{self.color}"

** 优化修正
image

field的使用

  • 可变参数需要通过default_factory来指定类型或者默认值
    image

image

field常用参数

  • default: 字段的默认值
    ** aa : str = dataclasses.field(default=4) # 指定默认值为4

  • default_factory: 定义可变量参数的默认值,不能与 default 同时存在
    ** children : list = dataclasses.field(default_factory =list) # 指定默认值的空list

  • init: 如果为 true默认值,该字段作为参数包含在生成的init()方法中
    ** 如果为false,该字段不会包含init()方法的参数中
    ** 在实例化的时候是否需要传递此参数,ture必须要,false选填但是需要默认值
    ** weihgt : int = field(default = 3, init = False) # 默认值为3,选填项
    ** weihgt : int = field(init = Ture) # 必填

  • repr:如果为 true默认值,该字段包含在生成的repr()方法返回的字符串中
    ** 如果为False,该字段不会包含在生成的repr()方法返回的字符串中
    ** 为False时,print、return、logging都不出会出该字段

asdict() 转化实例对象为字典格式

image


from dataclasses import dataclass,field,asdict
@dataclass
class Cats:
    name : str
    color : str
    weihgt : int
    children : list = field(default_factory=list)
if __name__ == '__main__':
    cas = Cats('英短',9,'黑色',[3,8,6,8])
    print(cas)
    # 结果是: Cats(name='英短', color=9, weihgt='黑色', children=[3, 8, 6, 8])
    print(asdict(cas))
    # 结果是: {'name': '英短', 'color': 9, 'weihgt': '黑色', 'children': [3, 8, 6, 8]}