• 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

  • 相关阅读:
    蓝桥杯-网络安全-练习题-crypto-rsa
    网络基础之重中之重
    Typescript学习
    线性表但是是Java中数组实用使用
    抑制肯定响应消息指示位(SPRMIB)
    计算机网络常见的名词解释
    了解 HarmonyOS
    知物由学 | 弹幕蜂拥而入,智能审核平台如何用技术破局?
    Django DRF权限组件
    【ABAQUS】模态分析
  • 原文地址:https://blog.csdn.net/lemisky/article/details/133999361