零基础入门python08:用类和对象重构个人记账本

发布时间:2026/8/17 22:46:26

零基础入门python08:用类和对象重构个人记账本
零基础入门python08用类和对象重构个人记账本一、上一篇课后练习讲解上一篇要求给 JSON 账目增加kind字段。参考实现是新增记录时强制要求kind为income或expense读取旧文件时用record.get(kind, expense)兼容历史数据而不是直接假设每条旧数据都有新字段。可执行验收答案defnormalize_record(record:dict)-dict:kindrecord.get(kind,expense)ifkindnotin{income,expense}:raiseValueError(kind 只能是 income 或 expense)amountfloat(record[amount])ifamount0:raiseValueError(金额不能为负)return{**record,kind:kind,amount:amount}old{amount:12.5,note:午餐}new{amount:100,kind:income,note:工资}assertnormalize_record(old)[kind]expenseassertnormalize_record(new)[kind]incometry:normalize_record({amount:1,kind:gift})exceptValueErrorasexc:print(exc)else:raiseAssertionError(非法 kind 没有失败)升级旧 JSON 时先逐条调用normalize_record发现损坏记录要报告编号并停止写回不要读取一半就用空列表覆盖原文件。二、本篇为什么要学习类当账本只有几个函数时还不难随着读取、添加、统计、保存越来越多函数之间需要共享records和文件路径。类把“数据”和“操作数据的函数”放在一起形成一个有边界的对象。三、完整实现fromdataclassesimportdataclass,asdictfrompathlibimportPathimportjsondataclassclassRecord:一条账目使用 dataclass 自动生成初始化和可读表示。amount:floatkind:strnote:strclassLedger:管理账目生命周期调用方不需要知道 JSON 文件的细节。def__init__(self,path:Path):self.pathpath self.records:list[Record][]self.load()defload(self)-None:ifnotself.path.exists():returndatajson.loads(self.path.read_text(encodingutf-8))self.records[Record(float(x[amount]),x.get(kind,expense),x.get(note,))forxindata]defadd(self,amount:float,kind:str,note:str)-None:ifamount0orkindnotin{income,expense}:raiseValueError(金额必须大于0类型必须是income或expense)self.records.append(Record(amount,kind,note.strip()))defsummary(self)-dict[str,float]:incomesum(x.amountforxinself.recordsifx.kindincome)expensesum(x.amountforxinself.recordsifx.kindexpense)return{income:income,expense:expense,balance:income-expense}defsave(self)-None:payload[asdict(record)forrecordinself.records]self.path.write_text(json.dumps(payload,ensure_asciiFalse,indent2),encodingutf-8)Ledger隐藏了文件读写细节未来换成 SQLite 时命令行层不必重写Record表达一条数据Ledger表达一组数据和业务操作。这就是封装的实际价值。四、运行示例ledgerLedger(Path(records.json))ledger.add(5000,income,工资)ledger.add(35,expense,午餐)ledger.save()print(ledger.summary())预期{income: 5000, expense: 35, balance: 4965}。课后练习增加按月份筛选统计下一篇拆分模块并加入日志调试。实战补充从数据类到账本对象当账本同时拥有记录、文件路径和保存规则时类可以把状态和操作放进一个边界。fromdataclassesimportdataclass,asdictdataclassclassRecord:amount:Decimal kind:strnote:strclassLedger:def__init__(self,path:Path):self.pathpath self.records:list[Record][]self.load()defadd(self,amount:Decimal,kind:str,note:str)-None:ifamount0orkindnotin{income,expense}:raiseValueError(金额必须为正类型只能是 income 或 expense)self.records.append(Record(amount,kind,note.strip()))类的价值不是把函数改成方法而是限制谁能修改内部状态外部只调用 add、summary 和 save未来把 JSON 换成 SQLite 时命令行不必重写。验收与课后练习测试新增收入、支出、非法类型和重新加载课后增加按月份过滤下一篇拆分模块并加入日志。本篇结束完整模块文件本节不是代码片段而是本篇结束时该模块的完整版本。请先备份旧文件再整体替换替换后重新运行本篇命令和测试。阅读时重点看本篇新增的函数、事务边界和错误处理未涉及的代码先不要自行删减。main.pyfromdataclassesimportdataclass,fielddataclassclassOrder:id:intitems:list[str]field(default_factorylist)defadd(self,item):self.items.append(item)orderOrder(1)order.add(Python Book)print(order)

相关新闻

Win10/11 玩不了老游戏?dxwrapper 免费兼容工具三步速成:经典游戏 DirectX 修复完整指南

Win10/11 玩不了老游戏?dxwrapper 免费兼容工具三步速成:经典游戏 DirectX 修复完整指南

2026/8/17 22:46:26

Win10/11 玩不了老游戏?dxwrapper 免费兼容工具三步速成:经典游戏 DirectX 修复完整指南 【免费下载链接】dxwrapper Fixes compatibility issues with older games running on Windows 10/11 by wrapping DirectX dlls. Also allows loading custom lib…

猫抓cat-catch浏览器资源嗅探扩展上手指南:3步实现网页视频音频一键捕获与M3U8快速下载

猫抓cat-catch浏览器资源嗅探扩展上手指南:3步实现网页视频音频一键捕获与M3U8快速下载

2026/8/17 22:46:26

猫抓cat-catch浏览器资源嗅探扩展上手指南:3步实现网页视频音频一键捕获与M3U8快速下载 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch …

网盘下载提速工具实测:3步拿到百度阿里等九大网盘直链,非会员也能一键解析

网盘下载提速工具实测:3步拿到百度阿里等九大网盘直链,非会员也能一键解析

2026/8/17 22:36:26

网盘下载提速工具实测:3步拿到百度阿里等九大网盘直链,非会员也能一键解析 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / …

百度地图AK白名单配置全解析:从原理到Spring Cloud Gateway二次防护

百度地图AK白名单配置全解析:从原理到Spring Cloud Gateway二次防护

2026/8/17 23:46:28

1. 项目缘起:为什么需要为百度地图应用配置白名单? 最近在做一个项目,需要在前端页面集成百度地图的JavaScript API来展示一些位置信息。开发阶段一切正常,地图加载、标记点、信息窗口都跑得很顺畅。但项目一上线,问题…

MySQL表锁深度解析:从原理到实践,掌握并发控制核心机制

MySQL表锁深度解析:从原理到实践,掌握并发控制核心机制

2026/8/17 23:46:28

1. 项目概述:理解MySQL表锁的本质在数据库日常运维和开发中,锁是一个绕不开的话题。尤其是当你的应用开始面临并发压力,或者某个后台任务长时间运行导致页面“卡死”时,锁往往是第一个被怀疑的对象。今天我们不谈那些复杂的行锁、…

MySQL数据目录迁移实战:从备份到验证的完整操作指南

MySQL数据目录迁移实战:从备份到验证的完整操作指南

2026/8/17 23:46:28

1. 为什么需要迁移MySQL数据目录?在Linux服务器运维的日常里,给MySQL数据库搬家——也就是更改它的数据存储路径,绝对算得上是一项“实践常用”的操作。你可能觉得这无非就是改个配置、挪个文件夹,但真正动过手的人都知道&#xf…

WCF入门指南:从服务契约到分布式通信实战

WCF入门指南:从服务契约到分布式通信实战

2026/8/17 23:46:28

1. 从“远程调用”到“服务契约”:WCF的核心设计哲学如果你刚开始接触企业级应用开发,尤其是涉及到不同系统、不同平台之间需要通信的场景,那么“WCF”这个名字你迟早会遇到。WCF,全称Windows Communication Foundation&#xff0…

Spring Boot集成IBM MQ:Apache Camel实现优雅解耦与高效消息处理

Spring Boot集成IBM MQ:Apache Camel实现优雅解耦与高效消息处理

2026/8/17 23:46:28

1. 项目概述与核心价值最近在做一个需要与老牌企业级消息中间件IBM MQ集成的项目,技术栈选型是Spring Boot。说实话,第一次接触IBMMQ时,看着它那套复杂的客户端配置和JMS API,头都大了。传统的JmsTemplate方式虽然直接&#xff0c…

提升 MiniMax-Music-3 音乐质量的6个参数调优技巧:CFG、采样步数与种子详解

提升 MiniMax-Music-3 音乐质量的6个参数调优技巧:CFG、采样步数与种子详解

2026/8/17 23:36:28

提升 MiniMax-Music-3 音乐质量的6个参数调优技巧:CFG、采样步数与种子详解 【免费下载链接】MiniMax-Music-3 项目地址: https://ai.gitcode.com/hf_mirrors/Comfy-Org/MiniMax-Music-3 在 ComfyUI 中使用 MiniMax-Music-3 生成音乐时,你是否遇…

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

2026/8/17 1:28:42

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

2026/8/16 0:04:13

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

2026/8/17 8:40:51

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

LabVIEW异步调用实战:从原理到生产者消费者模式,解决界面卡顿与并行处理难题

LabVIEW异步调用实战:从原理到生产者消费者模式,解决界面卡顿与并行处理难题

2026/8/17 0:05:22

1. 项目概述:为什么异步调用是LabVIEW进阶的必修课? 如果你用LabVIEW做过稍微复杂点的项目,尤其是涉及界面响应、多任务并行或者硬件IO等待的场景,大概率遇到过这样的窘境:前面板点个按钮,整个程序就“卡死…

LabVIEW异步调用实战:解决界面卡顿与并行处理难题

LabVIEW异步调用实战:解决界面卡顿与并行处理难题

2026/8/17 0:05:22

1. 项目概述:为什么异步调用是LabVIEW进阶的必经之路如果你在LabVIEW里写过稍微复杂点的程序,尤其是涉及到界面响应、多任务并行或者硬件IO等待,大概率会遇到一个头疼的问题:程序“卡”住了。前面板点不动,进度条不更新…

飞书局域网文件传输实战:3种方案实现高速点对点传输

飞书局域网文件传输实战:3种方案实现高速点对点传输

2026/8/17 0:05:22

1. 项目概述:为什么要在局域网内用飞书传文件? 飞书作为一款主流的协同办公套件,其核心功能是围绕云端协作设计的。无论是文档、表格还是文件,通常的分享逻辑都是“上传到云端 -> 生成链接 -> 分享给同事”。这个流程在互联…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/17 12:00:53

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/15 10:10:27

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/14 19:35:14

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…