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

封装和闭包

目录

1 封装

1.1 封装的概念

1.2 封装实例

实例1:个人信息(年龄)

实例2:银行系统

2 闭包

2.1 闭包的概念

2.2 闭包的作用

2.3 闭包的使用场景——实例

实例1:简单的闭包

实例2:计数器


1 封装

1.1 封装的概念

封装​是面向对象编程的三大特性之一,它将数据(属性)和方法(操作)包装在一起,并对外隐藏内部实现细节,只暴露必要的接口。

我理解的封装就是把一个属性进行私有化,必须通过特定的方法才能访问。例如银行卡余额,再以及密码之类的需要加密保护的数据。

1.2 封装实例

例如聊天软件,它被多个部门开发,比如A部门负责聊天功能,B部门负责登录功能。所以登录密码会被B部门管理,如果不将密码变为私有属性,那么A部门只需要实例化对象之后就可以直接打印对象的属性,如此密码就会遭到泄露。如果是私有属性并封装,那么就需要调用专门的函数方法来访问打印私有属性,而A部门不知道调用什么方法来访问密码,直接访问则会报错。

接下来将用代码来结合理解

实例1:个人信息(年龄)

class Person: # 创建class类 def __init__(self, age): self.__age = age # 将年龄属性封装 def update_person(self, age): # 定义一个方法作为接口来修改私有属性——年龄 self.__age = age # 修改 return self.__age # 返回修改后的值 def get_age(self): # 定义一个方法作为查看这个私有属性的接口 return self.__age # 返回私有属性的值 person = Person(18) # 实例化对象,将年龄初始化为18 print(person.get_age()) # 使用get_age方法接口来访问并打印私有属性的值 打印结果为:18 print( person.update_person(20) ) # 使用update_person方法接口来访问并修改私有属性的值 打印结果为:20 try: print(person.__age) # 直接访问私有属性,会报错 except Exception as e: print( e ) # 直接访问的错误信息会被捕获并打印:'Person' object has no attribute '__age' try: person.__age = 30 # 直接访问并修改私有属性 虽然没报错,但是修改不成功 print(person.get_age()) # 使用正确接口访问打印年龄属性,发现年龄还是20,没有改变 except Exception as e: print(e)

此代码段的运行结果如下:

18
20
'Person' object has no attribute '__age'
20

实例2:银行系统

class BankAccount: # 创建类 def __init__(self): self.__balance = 0 # 私有属性:余额 def deposit(self, amount): # 存款 if amount > 0: self.__balance += amount # 定义了方法修改余额 return f"存款成功!当前余额¥{self.__balance:.2f}" return f"存款金额需要大于0" def withdraw(self, amount): # 取款 if amount < self.__balance: self.__balance -= amount # 定义方法修改余额 return f"取款成功!当前余额¥{self.__balance:.2f}" return f"取款{amount:.2f}失败!余额不足,当前余额¥{self.__balance:.2f}" def get_balance(self): # 定义方法查询余额 return f"当前余额¥{self.__balance:.2f}" bank_account = BankAccount() # 实例化对象 print(bank_account.get_balance()) # 通过get_balance接口来获取私有属性余额的值 打印结果:当前余额¥0.00 print(bank_account.deposit(1000)) # 通过deposit接口来修改私有属性余额的值 打印结果:存款成功!当前余额¥1000.00 print(bank_account.withdraw(600)) # 通过withdraw接口来修改私有属性余额的值 打印结果:取款成功!当前余额¥400.00 try: print(bank_account.balance) # 通过对象的属性想要访问私有属性余额的值 except AttributeError as e: print(e) # 捕获异常并打印 打印的结果:'BankAccount' object has no attribute 'balance' except Exception as e: print(e)

实例2流程图如图1-1所示

图1-1 流程图

2 闭包

2.1 闭包的概念

闭包是Python中一个非常重要的概念,它允许函数记住并访问其创建时的作用域,即使该函数在其原始作用域之外执行。

闭包是一个函数对象,它引用了其外部作用域(非全局作用域)中的变量。要形成闭包,需要满足三个条件:

1. 有嵌套函数(一个函数内部定义了另一个函数)

2. 内部函数引用了外部函数的变量

3. 外部函数返回内部函数

2.2 闭包的作用

1. 保持状态:闭包可以"记住"函数创建时的环境,实现类似对象的效果,但比对象更轻量。

2. 数据封装:将数据隐藏在函数内部,只通过特定接口访问,实现类似私有变量的效果。

3. 闭包可以先"预置"一些参数,然后在需要时执行。

2.3 闭包的使用场景——实例

我个人理解的闭包是把闭包当成一种封装,实际上就是函数嵌套。第一大点的封装是对属性进行封装,闭包是对一个函数的封装。

实例1:简单的闭包

def out_func(x): # 外部函数 def inner_func(y): # 内部函数 return x + y # 引用外部函数的变量x return inner_func # 返回内部函数 func = out_func(5) print(func(10)) # 输出15

光看代码我认为可能比较绕,可以通过给`def inner_func(y)`打一个断点进行调试,观察代码每一步的运行情况。也可通过图2-1流程图来理解。

图2-1 实例1运行流程图

实例2:计数器

def counter(): count = 0 def increment(): nonlocal count # 声明为闭包变量 count += 1 return count return increment c = counter() # c( ) ==> increment( ) print(c()) # 1 print(c()) # 2

这是一个简单的计数器,每调用一次count都会加1。可依照实例1的图2-1流程图理解此代码。

http://www.jsqmd.com/news/670894/

相关文章:

  • Source Han Serif CN:7种字重开源宋体的全面使用指南
  • CentOS7 KVM图形化搭建避坑实录:从镜像存放、存储池配置到网络桥接的每一步详解
  • 告别1秒等待!PCIe RN机制(DRS/FRS)实战解析:如何让你的设备启动快人一步
  • 告别内网穿透!利用宽带IPv6,让你的树莓派Emby影院随时随地流畅播放
  • 常见 网络安全 产品部署详解,零基础入门到精通,一篇全收藏
  • 基于深度学习的口腔疾病图像识别系统(UI界面+改进算法+数据集+训练代码)
  • B站缓存视频转换完整教程:5秒极速转MP4的终极方案
  • 3分钟快速上手!Windows风扇控制神器FanControl终极配置指南
  • 如何在5分钟内搞定Windows风扇控制:FanControl终极静音散热指南
  • EWSA Pro v7.40.821:GPU加速下的无线安全审计实战与效率革命
  • 快速上手Chrome二维码插件:免费工具让网页分享更简单
  • 数据分析指标是什么?数据分析指标都有哪些?
  • 你的STM32 FFT结果准吗?避开栅栏效应和精度陷阱的实战指南
  • Kerberos运维踩坑实录:从JDK版本到DNS解析,这10个报错我帮你趟平了
  • 3步构建完美静音系统:FanControl终极风扇控制完全指南
  • Spark大数据分析实战【1.0】
  • 信号处理入门:卷积到底在‘卷’什么?从音响混响到图像模糊的实际例子
  • 2026高性价比雅思机考模考平台指南:免费也能高效备考 - 品牌2026
  • FPGA实战:手把手教你用AXI EMC IP核驱动64M Nor Flash(附S29GL512S时序参数详解)
  • 专业推荐:2026年最值得购买的公众号排版软件 - 小小智慧树~
  • 深入解析ModTheSpire:专业级《杀戮尖塔》模组加载器架构与实战指南
  • 【AGI能源危机白皮书】:2026 SITS权威实测——单次LLM推理耗电超3台家用空调,你还在盲目部署?
  • 别再死记硬背SVPWM六边形了!一个‘开关状态’小技巧帮你秒懂电压矢量分布
  • Claude Opus 4.6 与 4.7 系统提示大变化:功能更新、规则调整全揭秘!
  • 2026年AI率降不下来?收藏12款降ai率工具超详细指南 - 降AI实验室
  • 统信UOS深度配置指南:打造你的专属高效文档工作流(输入法/WPS/编辑器技巧合集)
  • 3分钟解决Word学术引用难题:免费获取APA第7版完整模板
  • 2026年国内CRM市场格局:哪些厂商正在领跑客户管理赛道? - 毛毛鱼的夏天
  • FireRed-OCR Studio实战案例:汽车维修手册PDF→带故障码链接的交互式Markdown
  • Windows Server 2019上Oracle 19c安装踩坑实录:从下载WINDOWS.X64_193000_db_home.zip到Navicat连接成功