python数据类--dataclass

python数据类–dataclass

1、dataclass 介绍

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

2、举例

from dataclasses import dataclass
"""
场景:如果创建一只猫,信息包括猫的名字、体重、颜色。同时打印这个对象的时候,希望能打印出一个字符串(包含猫的各种信息)
"""
class Cat:
    name: str
    color: str
    weight: int

    def __init__(self, name, weight, color):
        self.name = name
        self.weight = weight
        self.color = color

    def __str__(self):
        return f"喵星人姓名:{self.name}, 年龄:{self.weight},颜色:{self.color}"

    def __repr__(self):
        return f"===>>>>> 喵星人姓名:{self.name}, 年龄:{self.weight},颜色:{self.color}"


if __name__ == '__main__':
    # 实例化
    cat = Cat("五百", 10, "灰色")
    print(cat)


"""
使用 dataclass 创建数据类
实例化的时候自动生成构造函数
"""

# 1.加类装饰器
# 2.为类变量添加类型提示
@dataclass
class Cat01:
    name: str
    color: str
    weight: int


if __name__ == '__main__':
    cat01 = Cat01("菠萝", "橘猫", 9)
    print(cat01)

3、field 的使用

1)定义:
对于常见和简单的用例,不需要其他功能。但是,有些数据类功能需要额外的每字段信息。为了满足这种对附加信息的需求,可以通过调用提供的 field() 函数来替换默认字段值。
2)用法:
提供了一个方法field(),如果通过调用 field() 指定字段的默认值,则该字段的类属性将替换为指定的 default 值。如果没有提供 default ,那么将删除类属性。目的是在 dataclass() 装饰器运行之后,类属性将包含字段的默认值,就像指定了默认值一样。

3)field 常用参数

①default 参数:字段的默认值
②init 参数:
    * 如果为 True(默认值),该字段作为参数包含在生成的 init() 方法中。
    * 如果为 False,该字段不会包含 init() 方法参数中。
③repr 参数:
    * 如果为 True(默认值),该字段包含在生成的 repr() 方法返回的字符串中。
    * 如果为 False,该字段不会包含在生成的 repr() 方法返回的字符串中。
④default_factory参数:定义可变量参数的默认值,default 和 default_factory 不能同时存在,可以指定类型

from dataclasses import dataclass, field

"""field default 参数"""
@dataclasses.dataclass
class Cat:
    name: str
    color: str
    weight: str = dataclasses.field(default=5)
    children: list = dataclasses.field(default_factory=list)
    children1: list = dataclasses.field(default_factory=lambda:[1,2,3])
    children2: dict = dataclasses.field(default_factory=lambda: {"name":"喵"})

"""field init 参数"""

@dataclasses.dataclass
class Cat:
    name: str
    color: str
    weight: str = dataclasses.field(default=5)
    children: list = dataclasses.field(default_factory=list,init=False)

"""field repr 参数"""
@dataclasses.dataclass
class Cat:
    name: str
    color: str
    weight: str = dataclasses.field(default=5)
    children: list = dataclasses.field(default_factory=list,repr=False)

@dataclass
class Cat:
    name: str
    color: str
    weight: int = 2
    children: list = field(default_factory=list)

if __name__ == '__main__':
    cat = Cat("菠萝", "橘猫", 9, [1,2,3])

4、常用的方法

asdict() 转化实例对象为字典格式
class Cat:
    name: str
    color: str
    weight: int = dataclasses.field(default=5)
    # 无参的函数
    children: list = dataclasses.field(default_factory=lambda:[1,2,3])
    children1: dict = dataclasses.field(default_factory=lambda: {"name":"喵"})

cat = Cat("aa","red",10,[1,3],{"name":"喵喵"})
dataclasses.asdict(cat)