闭着眼就能学会的装饰器

目录

一,闭包 

1,闭包函数含义以及三要素

2,定义一个简单的闭包

二,装饰器

1,装饰器的作用场景以及特点

2,定义一个简单的装饰器

1,需求1

2,需求2

三,装饰器的实例

1.排序并比较排序用时

2.添加身份校验


一,闭包 

1,闭包函数含义以及三要素

闭包函数是指在一个函数内部定义的函数,该内部函数可以访问外部函数的变量和参数,并且可以在外部函数执行结束后继续访问和操作这些变量和参数。

1,外层函数嵌套内层函数

2,内层函数可以访问外层函数的局部变量

3,外层函数可以返回内层函数

2,定义一个简单的闭包

def outer_func():x = 10def inner_func():print(x)return inner_funcclosure = outer_func()
closure()  # 输出:10

外层函数嵌套内层函数

这里的closure返回的是外层函数执行的结果,也就说内层函数

外层函数返回内层函数

内层函数可以访问外层函数的局部变量  x = 10

closure()执行的就是内层函数inner_func 的函数内容

二,装饰器

1,装饰器的作用场景以及特点

装饰器的作用是在被装饰函数的前后添加一些额外的操作,而无需修改原始函数的定义。这样可以实现代码的复用和功能的组合。常见的应用场景包括日志记录、性能统计、权限验证等。

用于在保持原始代码不变的情况下对其进行功能扩展或修改。

装饰器本质上是一个函数,它接受一个函数作为参数,并返回一个新的函数。

2,定义一个简单的装饰器

1,需求1

实现一个简单的需求 打印“hello”

def say_hello():print(f'hello')say_hello()

2,需求2

现在要求在原有函数不变的前提下,增加一个功能:实现打印(小米 hello)

def say_hello_xm(f):def xm():f()return xm

这是一个闭包

根据闭包的用法

把say_hello 当作变量赋予say_hello_xm

def say_hello_xm(f):def xm():f()return xmdef say_hello():print(f'hello')say_hello() =  say_hello_xm(say_hello)say_hello()

 在python中也有一个对于装饰器的表达

在要被装饰的函数前      @装饰器函数名

def say_hello_xm(f):def xm():f()return xm@say_hello_xm
def say_hello():print(f'hello')say_hello()

这就是一个简单的装饰器   在原有函数不变的前提下,对其增加新的功能

三,装饰器的实例

1.排序并比较排序用时

对列表以及他的浅copy列表进行排序
额外需求 : 在不改变函数内容的前提下,比较排序用时


# 有额外形参的  可以规定排序的方式“升序/倒序”
# 引入一个形参  sort_type  默认是False 正序   (=True则是倒序)
datas = [random.randint(0, 10000) for i in range(1000)]
# 随机1000个数
datas_copy = datas.copy()# f 就是要加工的函数
def add_function(f):def function(sort_type):stat = time.time()f(sort_type)print(f'{f.__name__} 用时{time.time() - stat}')return function# 闭包# 把my_fun1的全部赋予了f
# 外部函数又返回内部函数
# 内部函数又调用f()@add_function  # python中规定的,这就是把其下函数用  add_function  去装饰
def my_fun1(sort_type):datas.sort(reverse=sort_type)print(datas)@add_function
def my_fun2(sort_type):new_list = sorted(datas_copy, reverse=sort_type)print(new_list)

2.添加身份校验

显示主页面,用户页面,购物车页面

额外需求:在进入用户以及购物车页面前需要进行用户登录

user = None
def login_required(f):def check():global userif user:f()else:while True:user_name = input(f'输入用户名')pwd = input(f'输入密码')if user_name == '小龙' and pwd == '1230':f()user = '小龙'breakelse:print(f'用户名或密码错误')return checkdef home():print(f'我是首页')@login_required
def user_center():print(f'我是用户中心')@login_required
def shopping_cart():print(f'我是购物车')home()user_center()shopping_cart()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/49133.shtml

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

相关文章

初学51单片机之指针基础与串口通信应用

开始之前推荐一个电路学习软件,这个软件笔者也刚接触。名字是Circuit有在线版本和不在线版本,这是笔者在B站看视频翻到的。 Paul Falstadhttps://www.falstad.com/这是地址。 离线版本在网站内点这个进去 根据你的系统下载你需要的版本红线的是windows…

华盈生物-“表面等离子共振(SPR)技术如何进行靶点验证:揭秘靶点锁定的科学魔法”

在药物开发和生物研究中,靶点验证是一个至关重要的步骤。表面等离子共振(SPR)技术以其高灵敏度和实时监测能力,成为了靶点验证的理想工具。今天,我们将揭示SPR技术在靶点验证中的神奇应用,让我们一起看看它…

第九讲:POU与变量基础

POU(Program Organization Unit)的分类 一、定义及分类 POU即程序组成单元 二、三种POU的作用 1、功能/功能快:看作算法 功能块的POU是比较复杂的指令 三、功能块POU和功能POU的区别 1、理解功能POU(对比) 不添加实例名,就不需要去建立变量,所以就不会占到内存。 因…

算法题目整合4

文章目录 122. 大数减法123. 滑动窗口最大值117. 软件构建124. 小红的数组构造125. 精华帖子126. 连续子数组最大和 122. 大数减法 题目描述 以字符串的形式读入两个数字,编写一个函数计算它们的差,以字符串形式返回。输入描述 输入两个数字&#xff…

物联网专业创新人才培养体系的探索与实践

一、引言 随着物联网(IoT)技术的迅猛发展,物联网领域的人才需求日益增加。物联网技术作为新一轮信息技术革命的核心,已经渗透到社会生活的各个领域,对推动经济转型升级、提升国家竞争力具有重要意义。因此&#xff0c…

VUE之---slot插槽

什么是插槽 slot 【插槽】, 是 Vue 的内容分发机制, 组件内部的模板引擎使用slot 元素作为承载分发内容的出口。slot 是子组件的一个模板标签元素, 而这一个标签元素是否显示, 以及怎么显示是由父组件决定的。 VUE中slot【插槽】…

Postman的高级功能

Postman是一款功能强大的API测试工具,它提供了许多高级功能来帮助开发者和测试人员更高效地进行API测试和开发。以下是Postman在API测试中的一些高级功能: 1. 集合和文件夹 集合:用于组织相关的API请求。文件夹:在集合内部进一步…

Huffman编码和译码

Huffman编码(Huffman Coding),又称霍夫曼编码或赫夫曼编码,是一种用于无损数据压缩的熵编码(权编码)算法,由大卫霍夫曼(David A. Huffman)在1952年发明。Huffman编码属于可变字长编码(VLC)的一种,其基本思想是根据字符在数据中出现的频率来分配不同长度的编码,出现…

自己开发软件实现网站抓取m3u8链接

几天前一个同学说想下载一个网站的视频找不到连接,问我有没有什么办法,网站抓取m3u8链接 网页抓取m3u8链接。当时一听觉得应该简单,于是说我抽空看看。然后就分析目标网页,试图从网页源码里找出连接,有的源代码直接有,但是有的没有…

(二)C++之类与对象

一.类的申明 class 类名 { private: 私有的数据和成员函数; public: 公用的数据和成员函数; protected: 保护的数据和成员函数 };二.类的成员函数 构造函数(类的初始化,创建类时自动调用;初始化表,this指针) 默认构造函数 A();…

语法糖的setup和onMounted

遇到的问题:利用:style绑定响应式变量并结合css来动态更换颜色,绑定的响应式变量无法正常渲染 结论:本人将:style绑定响应式变量的值写在onMounted里面了,一个大失误,记录一下,利用setup语法糖默认初始化阶…

Redisson常用的数据结构及应用场景

Redisson 提供了一系列高级数据结构,这些数据结构封装了 Redis 的原生数据类型,提供了 Java API 的便利性和分布式特性。以下是 Redisson 中一些常用的数据结构,场景还在不断完善中: RBucket:这是一个简单的键值对存储…

Java二十三种设计模式-代理模式模式(8/23)

代理模式:为对象访问提供灵活的控制 引言 代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一个代替或占位符,以控制对它的访问。 基础知识,java设计模式总体来说设计模式分为三大类&#…

Carefree为高性能设计仿真及人工智能提供一站式解决方案

在当今数字化转型的浪潮中,程易科技作为行业领先的科技创新企业,致力于为客户提供高效、安全、智能的研发资源服务。我们的研发资源服务平台集成了四大核心组件——研发资源统一门户、HPC高性能计算平台、远程可视化前后处理平台以及AI人工智能及算法平台…

Qt 实战(7)元对象系统 | 7.6、Q_DECLARE_METATYPE详解

文章目录 一、Q_DECLARE_METATYPE详解1、基本概念2、使用场景3、使用方法4、示例:QVariant使用自定义类型5、总结 前言: 在Qt框架的C开发中,Q_DECLARE_METATYPE是一个重要且常用的宏,它扮演着连接自定义类型与Qt元对象系统&#x…

Varjo XR-4系列现已获得达索3DEXPERIENCE平台官方支持

近日,全球领先的工业虚拟和混合现实解决方案提供商Varjo宣布,Varjo XR-4系列现已获得达索3DEXPERIENCE平台的本地支持。这种集成为工程师和设计师带来了先进的虚拟和混合现实功能,他们可以通过沉浸式技术创新并简化他们的3D工作流程。 在达索…

【iOS】Tagged Pointer

目录 前言什么是Tagged Pointer?引入Tagged Pointer技术之前引入Tagged Pointer之后总结 Tagged Pointer原理(TagData分析)关闭数据混淆MacOS分析NSNumberNSString iOS分析 判断Tagged PointerTagged Pointer应用Tagged Pointer 注意点 Tagge…

堆的相关知识点

目录 大小堆 堆的实现 堆的创建 堆的销毁 交换 向上调整 向下调整 弹出首个元素 取出首个元素 判空 堆插入 大小堆 大堆:最上面的数字是最小的,越往下越大 小堆:最上面的数字是最大的,越往下越小 堆的复杂程度&#…

关于JMETER 压力测试工具安装 插入百万数据

‌jmeter 是 apache 公司基于 java 开发的一款开源压力测试工具,体积小,功能全,使用方便,是一个比较轻量级的测试工具,使用起来非常简 单。因为 jmeter 是 java 开发的,所以运行的时候必须先要安装 jdk 才可…

java设计模式:04-行为型模式-概览

行为型模式(Behavioral Patterns) 行为型模式(Behavioral Patterns)主要关注对象之间的通信和职责分配,旨在通过对象之间的相互作用来实现特定的功能。行为型模式不仅关注类和对象的结构,还关注它们之间的…