Python—面向对象小解(6)-闭包、装饰器

2024-06-03 10:28

本文主要是介绍Python—面向对象小解(6)-闭包、装饰器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、闭包

        在Python中,闭包(closure)是一个函数对象,即使在其词法作用域外被调用,它仍然能访问该作用域内的变量。闭包通过“捕获”周围作用域的变量,保持这些变量的状态,即使在外部函数已经返回之后,这些变量仍然可以被访问和修改。

        

闭包是指:

  • 一个嵌套函数。
  • 这个嵌套函数引用了它的外部函数中的自由变量。
  • 这个嵌套函数在其外部函数返回后,仍然可以访问这些自由变量。
# 局部变量的销毁问题def func():# 局部变量a = 10a = a+1print(a)func() # 函数调用结束后内部局部变量会自动销毁
func() # 第二次调用函数时,会重新定义局部变量,重新计算print('---------------------------')
# 使用闭包可以将局部变量保存下来,每次调用函数时,使用同一个局部变量操作
# 闭包的格式是函数的嵌套定义
def func1():# 定义局部变量a = 10def func2():# 内部声明局部变量nonlocal aa = a+1print(a)# 将内部定义的函数名返回return func2f2 = func1() # f2=func2
# 使用加法计算
f2()
f2()

相关概念:

  1. 嵌套函数(Nested Functions):在一个函数内部定义另一个函数。
  2. 自由变量(Free Variables):在闭包中使用的外部变量,这些变量并不是在闭包中定义的,但被闭包引用。
  3. 作用域(Scope):变量的可见范围。在Python中,通常有四种作用域:局部(Local)、嵌套(Enclosing)、全局(Global)和内建(Built-in),简称LEGB规则。

闭包的特性

闭包有以下几个重要特性:

  • 状态保持:闭包能够保持它创建时的状态。这意味着即使在外部函数的执行已经结束后,内部函数仍然可以访问其作用域内的变量。
  • 私有化变量:闭包常用于创建私有变量,因为这些变量只能通过闭包内部的函数进行访问和修改,外部无法直接访问。

闭包的实际应用

  1. 计数器
def make_counter():count = 0def counter():nonlocal countcount += 1return countreturn countercounter1 = make_counter()
print(counter1())  # 输出: 1
print(counter1())  # 输出: 2counter2 = make_counter()
print(counter2())  # 输出: 1
  1. 访问控制
def create_account(initial_balance):balance = initial_balancedef get_balance():return balancedef deposit(amount):nonlocal balancebalance += amountreturn balancereturn get_balance, depositget_balance, deposit = create_account(100)
print(get_balance())  # 输出: 100
print(deposit(50))    # 输出: 150
print(get_balance())  # 输出: 150

二、装饰器

        装饰器(Decorator)是Python中的一种设计模式,允许在不修改函数或方法定义的情况下,动态地给函数或方法增加功能。装饰器本质上是一个高阶函数(即接受函数作为参数或返回一个函数的函数),它返回一个新的函数,这个新函数通常对原函数进行了某种修改或扩展。

# 使用闭包定义装饰器
def func1(f):# 外部函数定义接受参数,参数的类型要求是其他函数# f需要接受其他函数,就是需要装饰修改逻辑的函数def func2():# 调用之前增加登录判断print('登录成功')# 调用需要修改执行的函数f()# 返回内部函数return func2# 支付功能已经编写完成,不能再随意修改,如果此时需要再支付中增加一个登录判断如何实现
def pay():print('支付')
# 调用装饰器
f2 = func1(pay) # f=pay  f2 = func2
f2()def order():print('下单')
  • 被装饰的函数数据返回

def login(f):"""登录装饰器:param f: 接收被装饰的函数:return:"""def inner(name, password):# 编写登录逻辑if name == '张三':if password == '123456':print('登录成功')# 登录成执行被装饰的函数# 可以给传递数据和接收返回值res= f(1000)print(res)else:print('密码错误')else:print('用户名错误')return innerdef pay(price):print('订单支付逻辑')print(f'支付金额{price}')return '支付成功'# 使用装饰器装饰支付函数
f = login(pay)
# f = inner
f('张三','123456')
  • 采用语法糖格式使用装饰器

    • 语法糖格式 @装饰器函数名

def login(f):"""登录装饰器:param f: 接收被装饰的函数:return:"""def inner(name, password,price):# 编写登录逻辑if name == '张三':if password == '123456':print('登录成功')# 登录成执行被装饰的函数res= f(price)print(res)else:print('密码错误')else:print('用户名错误')return inner# 使用语法糖
@login
def pay(price):print('订单支付逻辑')print(f'支付金额{price}')return '支付成功'# 调用被装饰的函数
# 此时pay函数变成了inneer函数
pay('张三','123456',1000)

这篇关于Python—面向对象小解(6)-闭包、装饰器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1026727

相关文章

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

Python安装时常见报错以及解决方案

《Python安装时常见报错以及解决方案》:本文主要介绍在安装Python、配置环境变量、使用pip以及运行Python脚本时常见的错误及其解决方案,文中介绍的非常详细,需要的朋友可以参考下... 目录一、安装 python 时常见报错及解决方案(一)安装包下载失败(二)权限不足二、配置环境变量时常见报错及

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(