首页 > 其他分享 >花里胡哨的装饰器

花里胡哨的装饰器

时间:2024-07-04 14:08:38浏览次数:14  
标签:函数 print test time 花里胡哨 pass 装饰 def

千万别被名字给吓到了,什么叫做装饰器?
顾名思义,就是给另一个函数进行装饰用的,简单说就是给别的函数添加额外的功能。
注意,装饰器的本质就是一个函数。
装饰器 = 高阶函数 + 函数嵌套 + 闭包
一、高阶函数
满足如下两个条件任何一个就属于高阶函数:
(1)函数的参数是一个函数
(2)函数的返回值是一个函数

直接上例子吧:
1> 函数的参数是一个函数
def result():
print('this is a test')
def test(func):
print('abc')

res = test(result)
print(res)
输出结果:
abc
None
2>函数的返回值是一个函数
def func():
return 'this is a test'

def test():
print('abc')
return func
res = test()
print(res())
输出结果:
abc
this is a test

二、函数嵌套
def test():
pass
def test1():
pass
def test2():
pass
上面这段代码就属于函数嵌套

三、闭包
所谓闭包听起来似乎不知所云,其实就是函数的作用域。
def test():
pass
def test1():
name = 'jack'
pass
def test2():
name = 'lucy'
pass

上面这段代码中test2整个函数是一个包,test1整个函数是一个包,test整个函数是最外层的一个包。闭包可以理解为比如name = 'lucy'
这个变量只存在于test2这个包里。

四、装饰器的特点
(1)不能改变被装饰函数的源代码
(2)不能改变被装饰函数的调用方式

下面写个装饰器,自己体会。别问为什么,我不知道该怎么解释,就这么用就对了。运用之妙,存乎一心,用多了自然了然。

写个需求,给函数test()增加一个判断函数执行耗时的功能,并且把给test()函数传参数<参数是可变长,不一定是几个,也不一定是什么形式,比如列表,字典都可以。>,加上人名和年龄。

import time
def timmer(func):
def warpper(args,**kwargs):
start_time = time.time()
res = func(
args,**kwargs)
end_time = time.time()
print('此次使用函数的人是%s,年龄是%s岁' %(args))
print('执行函数一共耗时%s' %(end_time-start_time))
return res
return warpper

@timmer --这里的意思是 test = timmer(test)
def test(*args,**kwargs):
time.sleep(2)
print('this is test')
return 'ok'

result = test('jack',20)
print(result)
输出结果:
this is test
此次使用函数的人是jack,年龄是20岁
执行函数一共耗时2.009286642074585
ok

标签:函数,print,test,time,花里胡哨,pass,装饰,def
From: https://www.cnblogs.com/kkbest/p/18281070

相关文章

  • csrf跨站请求,钓鱼网站实现示例,CSRF校验,CSRF相关装饰器,Auth模块,扩展Auth表
    ⅠDjango框架之csrf跨站请求【一】跨站请求伪造介绍【1】引入CSRF(Cross-SiteRequestForgery)跨站请求伪造是一种常见的网络攻击方式。攻击者通过诱导受害者访问恶意网站或点击恶意链接将恶意请求发送到目标网站上利用受害者在目标网站中已登录的身份来执行某些操作从而......
  • Django框架之Cookie和Session概念,Django操作cookie,Django操作Session,CBV添加装饰器
    ⅠDjango框架之Cookie和Session概念【一】Cookie与Session的发展史Cookie和Session是用来在Web应用程序中跟踪用户会话数据的两种常用技术。【1】Cookie的发展史1994年,网景通信公司推出了第一个浏览器Cookie技术。Cookie是存储在用户计算机上的小型文本文件,用于跟踪用户......
  • flask cbv加装饰器
    cbv加装饰器fromflaskimportFlaskfromflask.viewsimportMethodViewapp=Flask(__name__)app.debug=True###登录认证--->不能公用--》要么只能给fbv用,要么只能给cbv用defauth(func):definner(*args,**kwargs):print(args)#cbv,会有第一个参......
  • java设计模式--装饰器模式
    装饰器模式是一种结构型设计模式,它允许你动态地向对象添加额外的行为。装饰器模式通过将对象包装在一个装饰器类中,以提供额外的功能,而不是修改原始对象的结构。装饰器模式主要解决的问题是在不改变现有对象结构的情况下,动态地添加功能或修改行为。它可以避免使用子类继承的方式引......
  • 鸿蒙UI开发快速入门 —— part07:组件状态管理之@Prop/@Link装饰器
    1、前言我们在上一章学习了@State装饰器,@State装饰器的作用范围仅仅在当前组件,接下来,我们讨论如何从父组件中传入参数到子组件,让子组件随着父组件的状态发生变化。本章将要介绍的就是:@Props装饰器。2、@Props装饰器@Prop装饰的变量可以和父组件建立单向的同步关系。@Prop装......
  • 【鸿蒙实战开发】HarmonyOS-ArkUI教程@link装饰器双向数据传递的使用
    前言2024年可谓至关重要,而生态建设的前提,就是要有足够的开发人才。与之对应的,今年春招市场上与鸿蒙相关岗位和人才旺盛的热度,一方面反应了鸿蒙生态的逐渐壮大,另一方面也让人们对鸿蒙下一阶段的发展更具信心。随着鸿蒙市场份额的不断提升,相应的岗位也会迎来一个爆发式的......
  • flask中cbv加装饰器、闪现(flash)、g对象、蓝图、flask-session、wtforms
    开源项目,可写在简历里1#开源项目sql审核平台2-https://gitee.com/cookieYe/Yearning3-https://gitee.com/rtttte/Archery cbv加装饰器1fromflaskimportFlask2fromflask.viewsimportMethodView34app=Flask(__name__)56app.debug=True7......
  • 装饰器
    视频链接:【【专题】彻底学会Python装饰器】https://www.bilibili.com/video/BV1Vv411x7hj?p=2&vd_source=e6865dbe0ecc5ec30951bfda794228461、闭包要想了解装饰器,首先要了解一个概念,闭包。什么是闭包?一句话说就是,在函数中再嵌套一个函数,并且引用外部函数的变量,这就是一个闭包了......
  • Day25.密码加密、登录认证装饰器
    1.密码加密、登录认证装饰器_md5加密方法代码 md5加密方法代码:importhashlib#md5加密defget_pwd_md5(password):md5_obj=hashlib.md5()md5_obj.update(password.encode('utf-8'))#密码加盐salt='一二三四五'md5_obj.update(salt.enc......
  • 2024-06-05 拷贝、函数、装饰器、迭代生成器
    一、浅拷贝lists=[1,2,[6]]内存空间不同,浅拷贝内容不变 new_lists=copy(lists)lists.append(7)print(lists,new_lists)//[1,2,[6],7][1,2,[6]]改变列表中内容,内存空间相同,数值改变new_lists=copy(lists)lists[-1].append(7)print(lists,new_lists)//[......