python 简洁优雅的装饰数据类——dataclass(通过生成只有部分属性值的子类解决初始化时没有默认值必须传所有字段值的问题)
首先安利一下 dataclass 给不太了解这个东西的小伙伴
分享一个写的不错的入门文章: 理解 Python 的 Dataclasses(一)(10min 左右即可看完)
我这里直接举一个栗子如下, 我们定义一个数据对象
from dataclasses import dataclass, field
from typing import List@dataclass() # @dataclass(init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False)
class Book:name: strauthor: strsale_price: floatmain_character: Listcharacter_level: dictclassification: str = 'novel' # 注意这里默认属性一定要放在非默认属性后面end: bool = field(default=False)def init_nomal_book():book = Book(name='剑来',author='烽火戏诸侯',sale_price=99.9,main_character=['陈平安', '宁姚'],character_level={'陈平安': ['归真止境武夫', '玉璞境剑修'], '宁姚': '飞升境剑修'})return bookdef init_nomal_book():book_info = {'name': '剑来','author': '烽火戏诸侯','sale_price': 99.9,'main_character': ['陈平安', '宁姚'],'character_level': {'陈平安': ['归真止境武夫', '玉璞境剑修'], '宁姚': '飞升境剑修'}}book = Book(**book_info)return book
调用结果返回了一个 Book 实例化的对象, 如下
book = init_nomal_book()
Out[2]: Book(name='剑来', author='烽火戏诸侯', sale_price=99.9, main_character=['陈平安', '宁姚'], character_level={'陈平安': ['归真止境武夫', '玉璞境剑修'], '宁姚': '飞升境剑修'}, classification='novel', end=False)
一个使用过程中的痛点
我想获取一个用 dataclass 定义的数据对象, 这个对象里面一些属性没有默认值, 但是我只有部分数据做填充(这样是没有办法初始化这个对象的), e.g 这里假设我们没有 sale_price 这个属性的值
Book(...: name='剑来',...: author='烽火戏诸侯',...: main_character=['陈平安', '宁姚'],...: character_level={'陈平安': ['归真止境武夫', '玉璞境剑修'], '宁姚': '飞升境剑修'}...: )Traceback (most recent call last):File "D:\Anaconda3\envs\pythonProject\lib\site-packages\IPython\core\interactiveshell.py", line 3437, in run_codeexec(code_obj, self.user_global_ns, self.user_ns)File "<ipython-input-4-2cadd1114aee>", line 1, in <module>Book(
TypeError: __init__() missing 1 required positional argument: 'sale_price'
官方文档 中有介绍到 make_dataclass 可以自定义一个 dataclass 类, 关于这个方法官网给出了一个栗子是这样的
C = make_dataclass('C', [('x', int), 'y', ('z', int, field(default=5))], namespace={'add_one': lambda self: self.x + 1})
上面的代码其实等价于
@dataclass
class C:x: inty: 'typing.Any'z: int = 5def add_one(self):return self.x + 1
那我们就开始动工, 直接上代码
from dataclasses import field, make_dataclassdef make_part_dataclass(super_cls, **kwargs):part_cls_name = super_cls.__name__ + 'Part' # 新的子类名称part_cls_fields = [(field_name, field_type, field(default=None)) # 整理成make_dataclass 需要的数据定义格式 (字段名, 数据类型, 字段默认值)for field_name, field_type in super_cls.__annotations__.items()] # 取出父类中的属性part_cls = make_dataclass(part_cls_name, part_cls_fields, bases=(super_cls,)) # 产生新的子类, 继承通过 bases 实现return part_cls(**kwargs) # 返回新类的实例化对象
调用结果如下
book_info = {...: 'name': '剑来',...: 'author': '烽火戏诸侯',...: 'main_character': ['陈平安', '宁姚'],...: 'character_level': {'陈平安': ['归真止境武夫', '玉璞境剑修'], '宁姚': '飞升境剑修'}...: }
part_book = make_part_dataclass(Book, **book_info)
Out[12]: BookPart(name='剑来', author='烽火戏诸侯', sale_price=None, main_character=['陈平安', '宁姚'], character_level={'陈平安': ['归真止境武夫', '玉璞境剑修'], '宁姚': '飞升境剑修'}, classification=None, end=None)
python 简洁优雅的装饰数据类——dataclass(通过生成只有部分属性值的子类解决初始化时没有默认值必须传所有字段值的问题)相关推荐
- [python]数据类(dataclass)简介
文章目录 数据类定义 装饰器 field 初始化 数据比较 后处理 dataclasses方法 Python3.7引入了dataclass.dataclass装饰器可以声明Python类为数据类:数据 ...
- java爬取网页数据_利用Python做数据分析—对前程无忧数据类岗位进行分析
引言 随着时代的发展,我国在各行各业都需要大量的人才引进,处于近几年最热门的行业也称"最火行业":大数据.数据分析.数据挖掘.机器学习.人工智能,这五门行业各有不同又互有穿插.近几 ...
- python向数据库插入字符串数据,字符串中含有单引号,入库报错解决办法
目录 问题 解决办法 示例 问题 最近处理部分数据,某些字段的数据中,含有单引号(含有双引号应该没有影响,如果报错,解决办法和单引号的方式类似)入库是会报错. 针对这一问题,解决办法如下: ...
- python中类的定义方法_Python类的定义、方法和属性使用
类用来描述具有相同的属性和方法的对象的集合. 对于在类中定义的函数,称为方法. 类变量不直接叫做类变量,称为属性. 1.类的定义 例子: classUser():pass 说明: (1)定义了一个类名 ...
- Python:11设计动物Animal类,该类包括颜色color属性与叫call方法。再设计鱼Fish类,包括.....
设计一个表示动物(Animal)的类,该类包括颜色(color)属性与叫(call)方法. 再设计一个表示鱼的类,包括尾巴(tail)和颜色(color)两个属性,及叫(call)方法. 提示:让Fi ...
- Datatables表格数据初始化时回调函数中修改要显示的值
场景 Datables初始化表数据后,返回的status状态值为1,2,3 现在要根据返回值的状态显示相应的中文. 实现 { data: 'status',render: function (data ...
- python学习笔记之——装饰器及对象
1.反射之__import__ 我们知道import语句是用来导入外部模块的,当然还有from...import...也可以,但是其实import实际上是使用builtin函数__import__来工 ...
- Kt学习笔记(九)数据类、封闭类
文章目录 一.数据类 1.1.使用数据类 1.2.对象复制 1.3.数据类成员的解构 二.封闭类 一.数据类 数据类是 Kotlin 的一个语法糖. Kotlin 编译器会自动为数据类生成一些成员 ...
- python切片操作 当所有数据都省略时_Python切片操作
利用python解决问题的过程中,经常会遇到从某个对象中抽取部分值的情况."切片"操作正是专门用于实现这一目标的有力武器.理论上,只要条件表达式得当,可以通过单次或多次切片操作实现 ...
最新文章
- CentOS7安装配置redis-3.0.0
- 关于如何发现忠诚的下属的讨论
- GetProcAddress 根据 ordinal 导入函数
- PowerDesigner 15.1 安装步骤详细图解及破解
- 【208天】黑马程序员27天视频学习笔记【Day21-中】
- linux c进程和线程脑图,进程和线程
- UE4中Bebavior Tree中Delay及其后面代码失效的原因
- TCL_事务控制语言
- element ui实现动态显示textarea剩余字数
- Linux下的SYN flood***
- SwitchHosts 没有权限operation not permitted解决方案
- 中职一年级c语言考试试卷,一年级C语言课后习题答案.doc
- 一个简单的txt分割器
- VMWare安装CentOS8及黑屏问题解决方法
- 【114天】尚学堂高琪JAVA300篇视频精华笔记(1-6)
- 网络安全——WEP实现无线局域网安全
- 42.(leaflet之家)leaflet实现撒点图(仿echarts)
- 用于数据科学和机器学习的GitHub存储库和Reddit主题
- OSChina 周二乱弹 —— 求借妹纸肩膀一用!
- matplotlib-04 xlabel设置x轴的标签
热门文章
- ubuntu18.0.4桌面死机问题
- 10个iPad Air常见小问题及解决方法汇总
- python实现自动拨打电话_python 实现手机自动拨打电话的方法(通话压力测试)
- 哈密瓜水果的文案,水果哈密瓜文案高级感
- 说说 Pluma 插件管理框架
- 灭霸命令、女装大佬...GitHub上那些让你忍不住Star的奇葩项目
- 深入理解java虚拟机第一第二部分(周志明第三版)
- 10个实用技巧让你的 Vue 代码更优雅
- dau、mau、pcu、dnu、wau、acu、uv分别是什么意思?
- 做教育怎么引流?教育行业怎么引流?培训机构引流如何转化?