装饰器学习

ops/2024/10/19 23:38:16/

【一】什么是装饰器

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

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

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

【二】装饰器的用途

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

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

【三】装饰器的分类

【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/ops/5678.html

相关文章

C++类和对象:深入构造函数,static成员,友元函数

文章目录 1. 深入构造函数1.1 初始化列表1.2 explicit关键字1.2.1 自定义类型的隐式类型转换1.2.1 explicit 2. static成员3 友元3.1 友元函数3.2 友元类3.3 内部类 1. 深入构造函数 1.1 初始化列表 构造函数初始化类的成员变量有多种方式,最常用的一种方式就是初…

python——函数

概念 函数就是将一段具有独立功能的代码块整合到一个整体并命名,在需要的位置调用这个名称去完成对应的需求 定义函数 def 函数名(参数):代码1......return 值函数名 函数名由编程人员自定义的,满足标识符命名规则…

Python基础:【练手小实验系列】列表、元组、字典、集合

文章目录 题目练习题1: 列表合并和排序练习题2: 元组元素计数练习题3: 字典键值互换练习题4: 集合的交集与并集参考答案练习题1: 列表合并和排序练习题2: 元组元素计数练习题3: 字典键值互换练习题4: 集合的交集与并集题目 练习题1: 列表合并和排序 题目描述: 给定两个已经排…

Java后端-文件上传大小限制解决

spring版本 2.5.4 报错如下:The field multipartFile exceeds its maximum permitted size of 1048576 bytes. 我上传的文件大小为2.5MB,如下图 原因:springboot默认的上传单个文件大小为1MB,而一次请求最大为10MB。 解决方案…

代码随想录-哈希表 | 242 有效的字母异位词

代码随想录-哈希表 | 242 有效的字母异位词 LeetCode 242-有效的字母异位词解题思路代码复杂度难点总结 LeetCode 242-有效的字母异位词 题目链接 题目描述 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 注意:若 s 和 t 中每…

Jmeter 场景测试:登录--上传--下载--登出

为了练习Jmeter的使用,今天我要测试的场景是“登录--上传--下载--登出”这样一个过程. 测试的目标是我曾经练手写的一个文件分享系统,它要求用户只有登录后才可以下载想要的文件。 Jmeter总体结构: 第一步:添加HTTP Cookie管理器…

最邻近插值和线性插值

最邻近插值 在图像分割任务中:原图的缩放一般采用双线性插值,用于上采样或下采样;而标注图像的缩放有特定的规则,需使用最临近插值,不用于上采样或下采样。 自定义函数 这个是通过输入原始图像和一个缩放因子来对图像…

Elasticsearch:如何将 MongoDB 数据引入 Elastic Cloud

作者:Hemendra Singh Lodhi Elastic Cloud 是由 Elastic 提供的基于云的托管服务。Elastic Cloud 允许客户在亚马逊网络服务 (AWS)、谷歌云平台 (GCP) 和微软 Azure 上部署、管理和扩展他们的 Elasticsearch 集群。 MongoDB 是一种流行的 NoSQL 文档导向数据库&am…