• Python 数据类 - dataclass 的作用与不足


    https://docs.python.org/zh-cn/3/library/dataclasses.html
    https://peps.python.org/pep-0526/
    https://peps.python.org/pep-0557/

    dataclass 简单示例

    from dataclasses import dataclass
    
    
    @dataclass
    class User:
        name: str
        age: int
    
    
    if __name__ == '__main__':
        response_json = {'name': 'python', 'age': 32}
        user = User(**response_json)
        print(user.name, user.age)  # python 32
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    不用使用 dataclass 也可以

    class User:
        def __init__(self, name: str, age: int):
            self.name = name
            self.age = age
    
    
    if __name__ == '__main__':
        response_json = {'name': 'python', 'age': 32}
        user = User(**response_json)
        print(user.name, user.age)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    User 显得稍显麻烦,不过这里很简单,倒也无所谓。

    dataclass 优势

    1. dataclass 比直接使用 class 书写更简洁, 看起来一目了然
    2. dataclass 自动实现实用方法,比如 __repr__
    3. Pycharm 的完全代码提示

    dataclass 的不足

    不支持嵌套

    from dataclasses import dataclass
    
    
    @dataclass
    class Info:
        sex: str
        phone: str
        address: str = None
    
    
    @dataclass
    class User:
        name: str
        age: int
        info: Info = None
    
    
    if __name__ == '__main__':
        response_json = {
            'name': 'python',
            'age': 32,
            'info': {
                'sex': '',
                'phone': '',
                'address': 'https://python.org/'
            },
        }
        user = User(**response_json)
        # 显然这里我们期望的不是 dict
        assert isinstance(user.info, dict)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    不支持扩展字段

    from dataclasses import dataclass
    
    
    @dataclass
    class User:
        name: str
        age: int
    
    
    if __name__ == '__main__':
        response_json = {
            'name': 'python',
            'age': 32,
            'address': 'https://python.org/'
        }
        # TypeError: __init__() got an unexpected keyword argument 'address'
        user = User(**response_json)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    使用 datclass 库弥补这些不足

    https://github.com/foyoux/datclass

    pip install datclass
    
    • 1

    datclass 简单示例

    from dataclasses import dataclass
    
    from datclass import DatClass
    
    
    @dataclass
    class Info(DatClass):
        sex: str
        phone: str
        address: str = None
    
    
    @dataclass
    class User(DatClass):
        name: str
        age: int
        info: Info = None
    
    
    if __name__ == '__main__':
        response_json = {
            'name': 'python',
            'age': 32,
            'info': {
                'sex': '',
                'phone': '',
                'address': 'https://python.org/',
                'field': 'extra'
            },
        }
        user = User(**response_json)
        assert isinstance(user.info, Info)
        assert isinstance(user.info, Info)
    
        print(user.info.address)  # https://python.org/
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    datclass 附带一个命令行命令用以自动生成 DatClassdatclass

  • 相关阅读:
    【设备树添加节点】
    TypeScript基础之typeof 类型操作符
    系统移植 DAY2(board_name的寻找)
    8c SQL手册 六
    计算机毕业设计选什么题目好?springboot 学习笔记系统
    ros2 服务通讯示范源代码2023年9月27
    在原生APP中集成Unity容器
    浅析:OMS和ERP、WMS、TMS之间的关系?
    Spring-boot项目:Whitelabel Error Page(@Controller+@RestController的区别)
    【PyTorch深度强化学习】DDPG算法的讲解及实战(超详细 附源码)
  • 原文地址:https://blog.csdn.net/lemisky/article/details/133999361