封装和闭包
目录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)此代码段的运行结果如下1820Person object has no attribute __age20实例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流程图理解此代码。