八、python 数据类dataclass

# -*- coding: utf-8 -*-
# @Time    : 2023/4/24 22:10
# @Author  : yanfali
# @File    : dataclass_.py
# @Software: 数据类dataclass

"""一、dataclass 介绍
操作类属性的默认值、类型等
优势:可读性强、操作灵活、轻量
应用场景:创建对象、完美融合平台开发ORM"""

"""案例:场景:如果创建一只猫,信息包括猫的名字、体重、颜色。同时打印这个对象的时候,希望能打印出一个字符串(包含猫的各种信息)应该如何编写代码
问题:
数据修改不方便
代码冗余
解决方案:
使用自定义类实现数据类"""
# class Cat:
#     name:str
#     color:str
#     weight:int
#
#     def __init__(self,name,color,weight):
#         self.name=name
#         self.color=color
#         self.weight=weight
#
#     def __str_(self):
#         """打印对象信息"""
#         return f"猫咪姓名={self.name} 颜色={self.color} 体重={self.weight}"
#
#     def __repr__(self):
#         """以字符返回"""
#         return f"===>>>猫咪姓名={self.name} 颜色={self.color} 体重={self.weight}"
#
# c=Cat("miaomiao","黄色",10)
# print(c) #如果注释__str__方法,则返回<__main__.Cat object at 0x000002DA7DE2FDC8>
# print(c) #如果不注释,才打印想要的对象信息。===>>>猫咪姓名=miaomiao 颜色=黄色 体重=10

"""数据类更优雅的实现方式
使用dataclass创建数据类
实例化的时候自动生成构造函数"""

#1、最简单的dataclass用法
# from dataclasses import dataclass
# @dataclass()
# class Cat:
#     name:str
#     color:str
#     weight:int
#
# if __name__ == '__main__':
#     cat=Cat("miao","蓝色",10)
#     print(cat) #Cat(name='miao', color='蓝色', weight=10)

"""2、field常用方法
参数名    参数功能
default    字段的默认值
default_factory    定义可变量参数的默认值,default 和 default_factory 不能同时存在
init   如果为 true(默认值),该字段作为参数包含在生成的 init() 方法中。False相反。
repr   如果为 true(默认值),该字段包含在生成的 repr() 方法返回的字符串中"""

#1、default/default_factory指定类型和默认值
#注意同一个参数里不能同时存在default和default_factory
# 如children:list=field(default=2,default_factory=list)

# from dataclasses import dataclass,field
# @dataclass()
# class Cat:
#     name: str
#     color: str =field(default="white") #default指定固定类型str/tuple的默认值和类型
#     weight:int=field(default=2)
#     children:list=field(default_factory=list) #指定可变类型list/dict的默认值和类型
# if __name__ == '__main__':
#     cat=Cat("喵喵")
#     print(cat) #Cat(name='喵喵', color='white', weight=2, children=[])

#2、init参数
#如果为 True(默认值),该字段作为参数包含在生成的 init() 方法中。
#如果为 False,该字段不会包含 init() 方法参数中。
# from dataclasses import dataclass,field
# @dataclass()
# class Cat:
#     name: str
#     color: str
#     weight:int=field(default=2,init=False)
# if __name__ == '__main__':
#     cat=Cat("喵喵","蓝色")  #不需要传weight
#     print(cat) #Cat(name='喵喵', color='蓝色', weight=2)

#3、repr参数
#如果为 True(默认值),该字段包含在生成的 repr() 方法返回的字符串中。
#如果为 False,该字段不会包含在生成的 repr() 方法返回的字符串中
from dataclasses import dataclass,field
@dataclass()
class Cat:
    name: str
    color: str
    weight:int=field(default=2,repr=False)
if __name__ == '__main__':
    cat=Cat("喵喵","蓝色")  #不打印weight
    print(cat) #Cat(name='喵喵', color='蓝色')
    
from typing import List

a:List[int]=[]
a=[1,2,"aaa"]