当前位置: 首页 > article >正文

【Day 10 Java转Python】@property——把方法当属性用,Python的封装艺术

Java老兵写Python时最常问的问题“私有字段呢getter和setter呢没有这些封装还叫封装吗”别急Python告诉你封装不是为了写一堆getXxx()/setXxx()而是为了在需要时优雅地插入逻辑。今天我们就来聊聊property装饰器——它让Python的属性既能像字段一样直接访问又能像方法一样动态计算和校验彻底告别Java里那些“样板式”的getter/setter。1. Java的封装防御性编程的“肌肉记忆”在Java中我们习惯这样写publicclassStudent{privateStringname;privateintage;publicStudent(Stringname,intage){this.namename;setAge(age);// 构造器中调用setter进行校验}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.namename;}publicintgetAge(){returnage;}publicvoidsetAge(intage){if(age0||age150){thrownewIllegalArgumentException(年龄非法);}this.ageage;}}好处可以在setAge里加校验未来还能改内部实现而不影响外部调用。坏处每个字段都要写一堆重复代码。IDE能自动生成但看着还是啰嗦。2. Python的简单粗暴直接暴露属性Python新手包括从Java转来的一开始可能这样写classStudent:def__init__(self,name,age):self.namename self.ageage sStudent(Alice,25)print(s.age)# 25s.age-5# 直接赋值没有任何校验程序可能崩在后面简单是简单但失去了封装的控制。外部可以随意赋一个不合法的值错误会在意想不到的地方爆发。3. property两全其美的方案Python提供了property装饰器让你可以把一个方法伪装成属性。调用时不用加括号就像访问字段一样自然。同时你可以定义属性名.setter来控制赋值逻辑。classStudent:def__init__(self,name,age):self.namename self._ageage# 约定下划线表示“保护属性”外部别直接访问propertydefage(self):获取年龄returnself._ageage.setterdefage(self,value):设置年龄带校验ifnotisinstance(value,int):raiseTypeError(年龄必须是整数)ifvalue0orvalue150:raiseValueError(年龄必须在0-150之间)self._agevalue sStudent(Alice,25)print(s.age)# 25像属性一样读取s.age30# 像属性一样赋值实际调用setterprint(s.age)# 30# s.age -5 # 抛出 ValueError: 年龄必须在0-150之间关键点property把方法变成只读属性。age.setter把另一个同名方法变成可写属性且能加校验逻辑。外部代码完全不用改以后你内部实现可以换成数据库存储、计算属性等调用方无感知。4. 对比Java的getter/setter特性JavaPythonproperty代码量每个字段至少5-6行一行self._xxx 装饰器方法可读性obj.getAge()obj.age封装性强字段private强通过下划线约定property控制访问校验逻辑写在setter中写在setter中计算属性需要额外方法如getFullName()直接用property调用时像属性惰性计算手动实现property配合缓存可实现计算属性示例Java需要显式调用方法Python看起来像字段classRectangle:def__init__(self,width,height):self.widthwidth self.heightheightpropertydefarea(self):面积根据当前宽高动态计算returnself.width*self.height rRectangle(3,4)print(r.area)# 12像字段一样但实际是计算出来的r.width5print(r.area)# 20自动更新Java中你得写r.getArea()而且通常不会把它和普通字段混为一谈。Python让计算属性和存储属性在使用时完全统一体现了“统一访问原则”。5. 高级用法删除器与只读属性只读属性只有getter没有setterclassCircle:def__init__(self,radius):self._radiusradiuspropertydefradius(self):returnself._radiuspropertydefdiameter(self):returnself._radius*2# 只读计算属性cCircle(5)print(c.diameter)# 10# c.diameter 20 # AttributeError: cant set attribute删除器属性名.deleterclassUser:def__init__(self,name):self._namenamepropertydefname(self):returnself._namename.deleterdefname(self):print(f删除用户{self._name})delself._name uUser(Alice)delu.name# 输出 删除用户 Alice6. 实战小练习银行账户的余额控制题目设计一个BankAccount类包含属性owner账户名_balance余额私有使用property定义balance只读属性外部不能直接修改余额。提供deposit(amount)和withdraw(amount)方法内部修改_balance并在修改时通过_balance的setter可选或直接在方法中校验。额外要求余额不能为负数取款不能透支。再添加一个只读属性interest_balance返回余额加上年利息假设年利率3%。参考代码可直接运行classBankAccount:def__init__(self,owner,initial_balance0):self.ownerowner self._balanceinitial_balancepropertydefbalance(self):只读属性外部不能直接赋值returnself._balancebalance.setterdefbalance(self,value):内部使用的setter也可以开放给外部但这里我们通过方法控制ifvalue0:raiseValueError(余额不能为负数)self._balancevaluedefdeposit(self,amount):ifamount0:raiseValueError(存款金额必须为正数)self._balanceamountprint(f存入{amount}元当前余额{self._balance})defwithdraw(self,amount):ifamount0:raiseValueError(取款金额必须为正数)ifamountself._balance:raiseValueError(f余额不足当前余额{self._balance}元)self._balance-amountprint(f取出{amount}元剩余余额{self._balance})propertydefinterest_balance(self):计算属性余额加上一年利息3%returnself._balance*1.03# 测试accBankAccount(张三,1000)print(f{acc.owner}当前余额{acc.balance})# 1000acc.deposit(500)# 存入 500 元当前余额1500acc.withdraw(200)# 取出 200 元剩余余额1300print(f一年后本息{acc.interest_balance:.2f})# 1339.00# 尝试直接修改balance会报错# acc.balance 5000 # AttributeError: cant set attribute? 实际上我们有setter但balance属性有setter这里是可以的等等上面的setter存在但外部调用acc.balance 5000会触发setter但我们不希望外部直接赋值应该去掉setter或者改成私有。正确做法只读属性不要提供setter。修改去掉balance的setter让deposit/withdraw直接操作_balance。修正版本只读balance不提供setterclassBankAccount:def__init__(self,owner,initial_balance0):self.ownerownerifinitial_balance0:raiseValueError(初始余额不能为负数)self._balanceinitial_balancepropertydefbalance(self):只读属性returnself._balancedefdeposit(self,amount):ifamount0:raiseValueError(存款金额必须为正数)self._balanceamountprint(f存入{amount}元当前余额{self._balance})defwithdraw(self,amount):ifamount0:raiseValueError(取款金额必须为正数)ifamountself._balance:raiseValueError(f余额不足当前余额{self._balance}元)self._balance-amountprint(f取出{amount}元剩余余额{self._balance})propertydefinterest_balance(self):returnself._balance*1.03accBankAccount(李四,2000)print(acc.balance)# 2000acc.deposit(1000)# 存入 1000 元当前余额3000# acc.balance 500 # AttributeError: cant set attributeprint(f一年后本息{acc.interest_balance:.2f})# 3090.007. 深入property的底层实现与何时使用property本质是描述符descriptor的语法糖。你可以用类属性方式手动实现但通常装饰器足够。什么时候用property需要校验或计算比如年龄范围、面积计算。需要向后兼容一开始用普通属性后来要加逻辑直接加property外部代码不用改。只读属性暴露内部状态但不允许修改。惰性计算第一次访问时计算后续缓存结果配合functools.cached_property。什么时候不用简单的数据容器比如DTO、配置对象直接用普通属性即可过度封装反而累赘。属性访问非常频繁且性能敏感property调用比直接访问字段稍慢但通常可忽略。8. 结语封装不是写模板而是留后路Java的getter/setter是“防御性”的提前为未来可能的变化做准备。Python的property则是“响应式”的先简单暴露字段等需要加逻辑时轻松改成property外部无感知。这就是Python的“鸭子类型”思想在属性层面的体现只要接口长得像属性它就是属性。今日挑战写一个Temperature类属性celsius摄氏度用property实现fahrenheit华氏度作为计算属性且fahrenheit可读写赋值时自动转换并存储到celsius。公式F C * 9/5 32C (F - 32) * 5/9。要求修改celsius时fahrenheit自动变化修改fahrenheit时celsius自动变化。欢迎评论区贴代码下篇预告Day 11 我们将学习异常处理与文件操作看看with语句如何比Java的try-with-resources更简洁。本文代码基于Python 3.14在VSCode中测试通过。如果觉得有收获请点赞、收藏、转发让更多Java转Python的朋友看到~

相关文章:

【Day 10 Java转Python】@property——把方法当属性用,Python的封装艺术

Java老兵写Python时最常问的问题:“私有字段呢?getter和setter呢?没有这些,封装还叫封装吗?” 别急,Python告诉你:封装不是为了写一堆getXxx()/setXxx(),而是为了在需要时优雅地插入…...

华中科技大学本科毕业论文LaTeX模板完整使用指南:快速上手终极教程

华中科技大学本科毕业论文LaTeX模板完整使用指南:快速上手终极教程 【免费下载链接】HUSTPaperTemp 华中科技大学本科毕业论文LaTeX模板 2017 项目地址: https://gitcode.com/gh_mirrors/hu/HUSTPaperTemp 对于华中科技大学的本科生来说,毕业论文…...

Ofd2Pdf完整指南:3种高效方法实现OFD到PDF的无损转换

Ofd2Pdf完整指南:3种高效方法实现OFD到PDF的无损转换 【免费下载链接】Ofd2Pdf Convert OFD files to PDF files. 项目地址: https://gitcode.com/gh_mirrors/ofd/Ofd2Pdf OFD(Open Fixed-layout Document)作为我国自主研发的电子文档…...

openclaw平替之nanobot源码解析(七):Gateway与多渠道集成腾

背景 StreamJsonRpc 是微软官方维护的用于 .NET 和 TypeScript 的 JSON-RPC 通信库,以其强大的类型安全、自动代理生成和成熟的异常处理机制著称。在 HagiCode 项目中,为了通过 ACP (Agent Communication Protocol) 与外部 AI 工具(如 iflow …...

CAGE vs RNA-seq:两种转录组测序技术的深度对比

在选择转录组测序方案时,你是否也在 CAGE 和 RNA-seq 之间犹豫?本文带你深入了解两种技术的核心差异与各自优势。转录组测序是功能基因组学研究的核心技术。在众多技术中,CAGE(Cap Analysis of Gene Expression)和RNA-…...

终极指南:如何免费使用Cursor Pro AI编程助手完整教程

终极指南:如何免费使用Cursor Pro AI编程助手完整教程 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your tri…...

终极命令行工具:如何用BaiduPCS-Go高效管理百度网盘文件

终极命令行工具:如何用BaiduPCS-Go高效管理百度网盘文件 【免费下载链接】BaiduPCS-Go iikira/BaiduPCS-Go原版基础上集成了分享链接/秒传链接转存功能 项目地址: https://gitcode.com/GitHub_Trending/ba/BaiduPCS-Go 在当今数据驱动的时代,高效…...

跨境电商研发团队文件外发安全管控

我有个朋友在深圳做跨境电商,主要卖智能家居产品到北美。上个月他跟我说了件差点让他丢大客户的事—— 他们的研发文件从来都是"谁需要找谁要",邮件、微信、U盘,什么渠道都有。有一天,研发部把一批新款智能锁的固件代码…...

Mem Reduct终极指南:三步解决电脑卡顿,高效释放内存空间

Mem Reduct终极指南:三步解决电脑卡顿,高效释放内存空间 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memr…...

10分钟训练高质量AI音色:RVC变声器实战指南

10分钟训练高质量AI音色&#xff1a;RVC变声器实战指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrieval-based-Voice-Conversion-WebUI …...

Anaconda Navigator打不开?三步搞定‘str‘ object has no attribute ‘get‘报错(附详细文件修改指南)

Anaconda Navigator启动报错深度修复指南&#xff1a;从原理到实战 当你满心期待地双击Anaconda Navigator图标&#xff0c;准备开始一天的数据分析工作&#xff0c;却迎面撞上"str object has no attribute get"这个晦涩的错误提示——这种挫败感我太熟悉了。作为P…...

Mi-Create:小米手表表盘设计的终极免费工具完整指南

Mi-Create&#xff1a;小米手表表盘设计的终极免费工具完整指南 【免费下载链接】Mi-Create Unofficial watchface creator for Xiaomi wearables ~2021 and above 项目地址: https://gitcode.com/gh_mirrors/mi/Mi-Create 还在为小米手表找不到心仪表盘而烦恼吗&#x…...

终极电路设计解决方案:如何用Draw.io ECE库高效绘制专业电路图

终极电路设计解决方案&#xff1a;如何用Draw.io ECE库高效绘制专业电路图 【免费下载链接】Draw-io-ECE Custom-made draw.io-shapes - in the form of an importable library - for drawing circuits and conceptual drawings in draw.io. 项目地址: https://gitcode.com/g…...

BepInEx完整指南:3步掌握Unity游戏插件注入技术

BepInEx完整指南&#xff1a;3步掌握Unity游戏插件注入技术 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx是一个功能强大的Unity游戏插件框架&#xff0c;专为Mono、IL2C…...

团队协作痛点怎么破?高安全性与高性价比企业云盘深度对比

近日&#xff0c;众多小微企业、创业团队与个人工作室在寻求高效协同工具时迎来了利好——随着2026年企业级SaaS市场的进一步成熟&#xff0c;以坚果云为代表的高性能企业网盘正以极高的性价比和专业度&#xff0c;解决着企业“数据安全与便捷协作”两大核心痛点。 为了帮助企…...

HoRain云--Flask中间件与扩展全解析

&#x1f3ac; HoRain云小助手&#xff1a;个人主页 &#x1f525; 个人专栏: 《Linux 系列教程》《c语言教程》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站&#xff0c;性价比超高&#xff0c;大内存超划算&#xff01;…...

跨平台协作:Windows主机+Mac笔记本共享Qwen3.5-9B实例

跨平台协作&#xff1a;Windows主机Mac笔记本共享Qwen3.5-9B实例 1. 项目背景与需求 去年开始使用OpenClaw进行个人自动化任务时&#xff0c;我遇到了一个典型的多设备协同问题&#xff1a;主力开发机是Windows台式机&#xff08;32GB内存RTX 3090&#xff09;&#xff0c;但…...

PyTorch 2.8虚拟机开发环境:VMware中配置Ubuntu并连接云端GPU

PyTorch 2.8虚拟机开发环境&#xff1a;VMware中配置Ubuntu并连接云端GPU 1. 为什么选择这种开发方式&#xff1f; 对于深度学习开发者来说&#xff0c;本地开发环境配置往往是个头疼的问题。特别是当你的笔记本显卡性能有限&#xff0c;又不想完全依赖云端开发时&#xff0c…...

【AI原生开发范式革命指南】:20年架构师亲授从Spring Boot到LLM-Ops的5大跃迁路径

第一章&#xff1a;从传统开发到AI原生&#xff1a;软件研发范式革命 2026奇点智能技术大会(https://ml-summit.org) 软件研发正经历一场静默却深刻的范式迁移——从以人类编写确定性逻辑为核心的传统工程模式&#xff0c;转向以提示工程、模型调用与反馈闭环为基座的AI原生架…...

Kandinsky-5.0-I2V-Lite-5s环境部署详解:JDK与依赖库的完整安装配置

Kandinsky-5.0-I2V-Lite-5s环境部署详解&#xff1a;JDK与依赖库的完整安装配置 1. 准备工作 在开始部署Kandinsky-5.0-I2V-Lite-5s之前&#xff0c;我们需要确保服务器具备运行该模型所需的基础环境。这个由文本生成视频的AI模型需要特定的Java运行环境和视频处理工具才能正…...

3步解放你的华硕笔记本:G-Helper轻量控制工具完全指南

3步解放你的华硕笔记本&#xff1a;G-Helper轻量控制工具完全指南 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Sc…...

League Akari:如何让英雄联盟游戏体验更智能高效?

League Akari&#xff1a;如何让英雄联盟游戏体验更智能高效&#xff1f; 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 您是否曾经在英雄联盟…...

千问3.5-9B MATLAB科学计算辅助:算法解释与代码转换

千问3.5-9B MATLAB科学计算辅助&#xff1a;算法解释与代码转换 1. 为什么MATLAB用户需要AI助手 MATLAB在科学计算领域占据重要地位&#xff0c;但工程师和研究人员经常面临两个核心痛点&#xff1a;理解复杂算法原理的困难&#xff0c;以及跨平台代码迁移的繁琐。传统方式下…...

再次革新 .NET 的构建和发布方式(三)僚

1 安装与初始化 # 全局安装 OpenSpec npm install -g fission-ai/openspeclatest # 在项目目录下初始化 cd /path/to/your-project openspec init 初始化时&#xff0c;OpenSpec 会提示你选择使用的 AI 工具&#xff08;Claude Code、Cursor、Trae、Qoder 等&#xff09;。 3 O…...

2026年AI应用开发完整路线:Java后端+Python大模型,少走2年弯路

文章强调AI应用开发需Java后端与Python并重&#xff0c;78%企业招聘要求Java后端知识。提供三条学习路线&#xff1a;Java后端基础、Java AI进阶、Python大模型实战。针对不同人群给出精准建议&#xff0c;指出跳过后端直接学Python是最大误区。掌握JavaPython的复合型工程师薪…...

软考高项通关秘籍:手把手教你用Excel打造需求跟踪矩阵(附模板下载)

软考高项实战指南&#xff1a;用Excel构建需求跟踪矩阵的7个关键步骤 在项目管理领域&#xff0c;需求跟踪矩阵就像是一张精准的导航地图&#xff0c;它能确保项目团队从需求源头到最终交付物始终保持正确的航向。对于备考软考高项&#xff08;信息系统项目管理师&#xff09;的…...

顶级开发团队设计的Harness工程项目源码什么样

顶级开发团队设计的Harness工程项目源码什么样 前言 近期,某顶级 AI Agent]研究团队的一个工业级 Harness 项目源码在开发者社区中引起广泛关注。这个项目是一个基于 TypeScript 的 CLI 形态 AI Coding Agent,其工程规模和架构成熟度令社区印象深刻: “REPL.tsx 单文件 87…...

JPEXS Free Flash Decompiler架构集成与系统对接实施指南

JPEXS Free Flash Decompiler架构集成与系统对接实施指南 【免费下载链接】jpexs-decompiler JPEXS Free Flash Decompiler 项目地址: https://gitcode.com/gh_mirrors/jp/jpexs-decompiler JPEXS Free Flash Decompiler&#xff08;FFDec&#xff09;作为业界领先的Fla…...

解决ComfyUI-BrushNet张量维度不匹配的3个实用方法

解决ComfyUI-BrushNet张量维度不匹配的3个实用方法 【免费下载链接】ComfyUI-BrushNet ComfyUI BrushNet nodes 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-BrushNet 在使用ComfyUI-BrushNet进行AI图像生成时&#xff0c;许多用户都会遇到令人困惑的张量维度…...

GKD订阅管理终极指南:如何用3步轻松解决订阅混乱难题

GKD订阅管理终极指南&#xff1a;如何用3步轻松解决订阅混乱难题 【免费下载链接】GKD_THS_List GKD第三方订阅收录名单 项目地址: https://gitcode.com/gh_mirrors/gk/GKD_THS_List 你是不是也遇到过这样的场景&#xff1f;打开GKD应用&#xff0c;面对几十个订阅源却不…...