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)