装饰器学习

embedded/2024/11/15 4:58:53/

【一】什么是装饰器

  • 装饰器指的就是为被装饰的对象添加新的功能

  • 器 代表工具 增加后的调用方式不变

  • 在不改变源代码和调用方式的基础上增加额外的新功能

【二】装饰器的用途

  • 对上线后的程序进行新功能的增加和修改

  • 给一个功能增加新的需求或者改变原来的程序运行逻辑

【三】装饰器的分类

【1】有参装饰器

【2】无参装饰器

  • 即没有参数的装饰器

【四】装饰器的原理

  • 闭包函数 + 函数对象的组合使用

【五】无参推导装饰器的语法

【1】为一段代码增加计时功能
(1) 面条版方法
import time
​
# 记录程序运行起始时间
start_time = time.time()
# 程序运行主代码逻辑
print(f"开始")
time.sleep(2)
print(f"结束")
# 记录程序运行结束时间
end_time = time.time()          
# 总消耗时间
print(f"当前程序总耗时:{end_time - start_time} s")         # 2s
(2) 函数
import time
​
​
def outer():print(f"开始")time.sleep(2)print(f"结束")
​
# 开始记录
start_time = time.time()
​
outer()
# 结束记录
end_time = time.time()
# 总消耗时间
print(f"当前程序总耗时:{end_time - start_time} s")
(3)闭包函数
import time
​
def show_show():print(f'开始')time.sleep(3)print(f'结束')def outer(func):def inner():func()# print(func)       这里的func 已经是show_show
​return inner
​
inners = outer(show_show)
inners()

【小练习】

定义一个用户数据字典 校验当前用户名和密码是否正确,如果正确则打印登录成功 否则打印失败

方法一:最原始最low
user_dict = {'username': 'knight', 'password': '123'}
​
​
def show():
​username_input = input(f"请输入用户名").strip()password_input = input(f"请输入密码").strip()if username_input == user_dict.get('username') and password_input == user_dict.get('password'):print(f"这是登陆成功后才能看到的动作片")else:print(f'登录失败')
​
​
show()
方法二:使用装饰器
user_dict = {'username': 'knight', 'password': '123'}
​
​
def outer(func):def inner():username_input = input(f"请输入用户名").strip()password_input = input(f"请输入密码").strip()if username_input == user_dict.get('username') and password_input == user_dict.get('password'):print(f"登录成功")func()else:print(f"登录失败")
​return inner
​
​
def transform():                    # 添加转账功能print(f'转账功能')
​
​
tra = outer(transform)          # tra = inner = outer(transform)
tra()
​
​
def withdral():                     # 添加取款功能print(f'取款功能')
​
​
dral = outer(withdral)          # dral = inner = outer(withdral)
dral()

无参装饰器的模板

def outer(func):'''
​:param func:    每一次需要调用传递的函数:return:    返回值是内嵌函数 inner 的函数内存地址'''
​def inner():# 在func()之前可以使用if等方法增加逻辑校验# 当符合指定条件后,可以允许执行传递进来的函数# 不符合条件的时候不执行函数func()# 在func()之后也可以做逻辑校验
​return inner

【六】有参装饰器

【1】根据指定的位置参数传递参数

def outer(func):def inner(usernam, monery):func(username, money)
​return inner
​
​
def transform(usrname, monery):print(f'向{username}转账{money}')
​
​
username = 'hyt'
money = 100000
transform(username, money)
​
tra = outer(transform)

【2】用可变长位置参数和可变长关键字参数,接收函数所需的参数

def outer(func):def inner(*args, **kwargs):func(*args, **kwargs)
​return inner
​
​
def transform(usrname, monery):print(f'向{username}转账{money}')
​
​
username = 'hyt'
money = 100000
transform(username, money)
​
tra = outer(transform)

http://www.ppmy.cn/embedded/7037.html

相关文章

【Linux】应用层协议:HTTP

URL 在之前的文章中我们实现了一个网络版本的计算器,在那个计算器中揉合了协议定制以及序列化反序列化的内容,我们当时也自己定制了一套协议标准,比如请求和响应的格式应该是什么?如何读到一个完整的报文?支持的运算符…

Flask 解决指定端口无法生效问题

问题重现 手动指定的IP端口是app.run(host0.0.0.0, port9304),但是启动的地址显示的却是http://127.0.0.1:5000。 if __name__ __main__:app.run(host0.0.0.0, port9304)启动地址如下: 解决方案 PyCharm会自动识别出来flask项目(即使你…

Spring AOP的实现方式与原理

目录 认识IOC与AOP AOP的实现方式 Aspect注解实现AOP 自定义注解实现AOP Spring AOP原理 代理模式 静态代理和动态代理 JDK动态代理 CGLIB动态代理 Spring AOP实现的哪种代理 认识IOC与AOP IOC又称为控制反转,也就是控制权发生了反转.在传统的程序中,我们是需要自己…

Android Studio实现页面跳转

建立文件 temp.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"…

行业模板|DataEase批发零售大屏模板推荐

DataEase开源数据可视化分析平台于2022年6月发布模板市场&#xff08;https://templates-de.fit2cloud.com&#xff09;&#xff0c;并于2024年1月新增适用于DataEase v2版本的模板分类。模板市场旨在为DataEase用户提供专业、美观、拿来即用的大屏模板&#xff0c;方便用户根据…

49.HarmonyOS鸿蒙系统 App(ArkUI)Tab导航组件的使用

HarmonyOS鸿蒙系统 App(ArkUI)Tab导航组件的使用 图片显示 Row() {Image($r(app.media.leaf)).height(100).width(100)Image($r(app.media.icon)).height(100).width(100) } 左侧导航 import prompt from ohos.prompt; import promptAction from ohos.promptAction; Entry C…

游戏测试之常见控制技能(下)

备注&#xff1a;未经博主允许禁止转载 个人笔记&#xff08;整理不易&#xff0c;有帮助&#xff0c;收藏点赞评论&#xff0c;爱你们&#xff01;&#xff01;&#xff01;你的支持是我写作的动力&#xff09; 笔记目录&#xff1a;学习笔记目录_pytest和unittest、airtest_w…

大模型入门相关文章

1.了解国内外大模型发展现状188个大模型和20个开源基础模型&#xff0c;《2023大模型产业发展白皮书》全面解析国内外大模型发展情况 - 知乎 (zhihu.com) 2.垂直领域&#xff0c;美妆大模型 关于懂美学的视觉大模型&#xff0c;我们问了美图 21 个问题 - 知乎 (zhihu.com) 3…