装饰器学习

【一】什么是装饰器

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

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

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

【二】装饰器的用途

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

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

【三】装饰器的分类

【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.mzph.cn/bicheng/1390.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Day08React——第八天

useEffect 概念:useEffect 是一个 React Hook 函数,用于在React组件中创建不是由事件引起而是由渲染本身引起的操作,比如发送AJAx请求,更改daom等等 需求:在组件渲染完毕后,立刻从服务器获取频道列表数据…

iOS RACScheduler 使用详解

RACScheduler 是 ReactiveCocoa 框架中的一个关键组件,用于在 iOS 开发中管理任务的并发执行。以下是如何详细使用 RACScheduler 的指南,以 Markdown 格式展示。 主要调度器 主线程调度器 用于在主线程上执行任务,通常用于 UI 更新操作。 …

Java:二叉树(1)

从现在开始,我们进入二叉树的学习,二叉树是数据结构的重点部分,在了解这个结构之前,我们先来了解一下什么是树型结构吧! 一、树型结构 1、树型结构简介 树是一种非线性的数据结构,它是由n(n>…

通用类的中文实体命名识别

中文命名实体识别(Chinese NER)调研:https://github.com/taishan1994/awesome-chinese-ner 论文:Unified Structure Generation for Universal Information Extraction (一统实体识别、关系抽取、事件抽取、情感分析&a…

TCP协议学习记录

TCP协议学习记录 简述 对TCP有诸多疑惑的地方: 1、TCP和socket的关系 2、TCP客户端和服务端如何区分 3、TCP连接的两端,端口号需要一致吗 什么是socket 一种编程抽象 编写程序时,利用socket可以使用TCP;假设现在已经将TCP协议…

Matlab无基础快速上手1(遗传算法框架)

本文用经典遗传算法框架模板,对matlab新手友好,快速上手看懂matlab代码,快速应用实践,源代码在文末给出。 基本原理: 遗传算法(Genetic Algorithm,GA)是一种受生物学启发的优化算法…

在Gtiee搭建仓库传代码/多人开发/个人代码备份---git同步---TortoiseGit+TortoiseSVN

文章目录 前言1.安装必要软件2. Gitee建立新仓库git同步2.1 Gitee建立新仓库2.2 Gitee仓库基本配置2.3 Git方式进行同步 3. TortoiseGitTortoiseSVN常用开发方式3.1 秘钥相关3.2 TortoiseGit拉取代码TortoiseGit提交代码 4. 其他功能探索总结 前言 正常企业的大型项目都会使用…

TR5 - Transformer的位置编码

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 目录 前言什么是位置编码1. 定义2. 三角函数3. 位置编码公式4. 位置编码示例 可视化理解位置编码1. 代码实现2. 观察不同位置对应的曲线3. 整句话的位置编码可…

排序 “贰” 之选择排序

目录 ​编辑 1. 选择排序基本思想 2. 直接选择排序 2.1 实现步骤 2.2 代码示例 2.3 直接选择排序的特性总结 3. 堆排序 3.1 实现步骤 3.2 代码示例 3.3 堆排序的特性总结 1. 选择排序基本思想 每一次从待排序的数据元素中选出最小(或最大)的一个…

Guitar Pro简谱输入方法 Guitar Pro简谱音高怎么调整,Guitar Pro功能介绍

一、新版本特性概览 Guitar Pro v8.1.1 Build 17在保留了前版本强大功能的基础上,进一步优化了用户体验和功能性能。新版本主要更新包括以下几个方面: 界面优化:新版界面更加简洁美观,操作更加便捷,即使是初学者也能快…

aixcoder介绍

最近了解了一下国内开源的aixcoder,代码自动补全的工具,可以理解为国内版开源的的copilot。 一开始公司给提供了一个代码自动补全的插件,这几天发现原来用的就是aixcoder,所以专门了解了一下。。 介绍 aiXcoder 是一款基于深度…

在线拍卖系统,基于SpringBoot+Vue+MySql开发的在线拍卖系统设计和实现

目录 一. 系统介绍 二. 功能模块 2.1. 管理员功能模块 2.2. 用户功能模块 2.3. 前台首页功能模块 2.4. 部分代码实现 一. 系统介绍 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系…

Docker - 简介

原文地址,使用效果更佳! Docker - 简介 | CoderMast编程桅杆https://www.codermast.com/dev-tools/docker/docker-introduce.html Docker是什么? Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。 D…

vulfocus靶场couchdb 权限绕过 (CVE-2017-12635)

Apache CouchDB是一个开源数据库,专注于易用性和成为"完全拥抱web的数据库"。它是一个使用JSON作为存储格式,JavaScript作为查询语言,MapReduce和HTTP作为API的NoSQL数据库。应用广泛,如BBC用在其动态内容展示平台&…

串口RS485

1.原理 全双工:在同一时刻可以同时进行数据的接收和数据的发送,两者互不影响 半双工:在同一时刻只能进行数据的接收或者数据的发送,两者不能同时进行 差分信号幅值相同,相位相反,有更强的抗干扰能力。 干…

vlan的学习笔记1

vlan: 1.一般情况下:以下概念意思等同: 一个vlan一个广播域 一个网段 一个子网 2.一般情况下: (1)相同vlan之间可以直接通信,不同vlan之间不能直接通信! (2)vlan技术属于二层技术&…

C语言中, 文件包含处理,#include< > 与 #include ““的区别

文件包含处理 指一个源文件可以将另外一个文件的全部内容包含进来 &#xff23;语言提供了#include命令用来实现文件包含的操作 #include< > 与 #include ""的区别 <> 表示系统直接按系统指定的目录检索 "" 表示系统先在 "" 指定…

Rust序列化和反序列化

Rust 编写python 模块 必备库 docker 启动 nginx 服务 NGINX 反向代理配置

MySQL下载与安装

文章目录 1&#xff1a;MySQL下载与安装2&#xff1a;配置环境变量3&#xff1a;验证是否安装成功 1&#xff1a;MySQL下载与安装 打开MySQL官网&#xff0c;MySQL 下载链接选择合适的版本和操作系统&#xff0c;页面跳转之后选择No thanks, just start my download.等待下载即…

linux中/etc/hosts文件的内容和功能

更准确的说是主机和ip地址映射绑定配置文件 用于主机名解析成ip地址的 转换配置 效果&#xff1a; 这个东西是局域网下面的解析&#xff0c;老师说是本地局域网解析 windows对应的就是