首页 > 编程语言 >python 装饰器

python 装饰器

时间:2023-07-14 10:12:25浏览次数:31  
标签:函数 python wrapper print hourse 装饰 def

目录

装饰器

#装饰器,反复的验证状态,从而判断是否继续下一步。经常用来判断用户的登陆状态。比如flask,他的很多东西都是装饰器
#装饰器依赖闭包

def test():
    print ('>>>text>>>')
#类比  a=10  b=a ,a=0是声明整数  b=a是声明函数。


def alex(t):
    print (t)
    test()
    print ('alex>>>>>alex')
a=test
a()
print ('华丽的分割线')
alex(a)
#装饰器特点:1.函数必须是作为参数传递给另外一个函数、 2.必须要有闭包的特点
#解释器函数规则
#作用域  LEGB
#L ;locale,比如定义了一个函数,再调用一个函数时,他会先在这个定义的域名内找
#E ;嵌套,如果没找到,他会去找外面嵌套他的那一层有没有
#G: global,如果还没有,他会找全局变量中有没有
#B : built-in,如果还没有,他会找内置函数有没有。如果内置还找不到就报错了
#!/usr/bin/env python
#-*- coding:utf-8 -*-
# BY:wenchao.li time: 2020/7/9
#定义一个装饰器
import time
def decorate(func):
    a=100
    print ('wrapper 打印测试')
    def wrapper():
        func()
        print ('刷漆')
        print ('铺地板')
    print ('正在校验')
    print ('wrapper 加载完成')
    time.sleep(2)
    print ('校验完成')
#调用原函数
    func()
    return wrapper

#使用装饰器
@decorate
def hourse():
    print ('---f1---')
hourse()

#在@在谁上面,谁就是被装饰函数。hourse是被装饰函数
#步骤
# 1;看到@,hourse被定义是被装饰函数。
# 2将被装饰函数作为参数传给decorate
# 3,执行decorate函数。
# 4.将返回值赋值给hourse,此时他只是hourse的一层皮,里面其实是wrapper
print (hourse)

hourse()
#!/usr/bin/env python
#-*- coding:utf-8 -*-
# BY:wenchao.li time: 2020/7/9
#定义一个毛坯房,来了两个装修公司
#如果装饰器是多层,谁离装饰器最近,就优先使用哪个装饰器。

def zhuangxiu1(func):
    print ('>'*20+'1start')
    def wrapper(*args,**kwargs):
        func()
        print ('喷漆')
    print ('>'*20+'1end')
    return wrapper
def zhuangxiu2(func):
    print ('>'*20+'2start')
    def wrapper(*args,**kwargs):
        func()
        print ('装门')
    print ('>'*20+'2end')
    return wrapper
#哪个离着hourse近,他就会先执行哪一个
@zhuangxiu2
@zhuangxiu1
def hourse():
    print ('我是毛坯房')
hourse()
#他会先把装修,把hourse 复制给func.给第一步 func=hourse  ,然后加载wrapper,打印出 1start 1end。然后扔出wrapper,赋值给hourse
#到第二层wrapper,func就是继承了上面第一层的wrapper加载第二层的wrapper,并赋值给hourse,这时候,hourse是第二层的wrapper
#!/usr/bin/env python
#-*- coding:utf-8 -*-
# BY:wenchao.li time: 2020/7/9
def zhuangxiu1(func):
    def wrapper(*args,**kwargs):
        func(*args,**kwargs)
        print ('铺砖')
    return wrapper

@zhuangxiu1
def hourse(time):
    print ('{}我是毛坯房' .format(time))
hourse('2020-6-12')

#带参数的装饰器是三层的
#最外层的函数接收装饰器参数,第二层接收函数的 第三层,负责接收函数的实参的
#!/usr/bin/env python
#-*- coding:utf-8 -*-
# BY:wenchao.li time: 2020/7/9
#模拟付款,要随时查询用户是否在线,所以谢一个装饰器
import time
islogin=False
def login():
    user=input('please input user:')
    password=input('please input pass')
    if user=='admin' and password=='123456':
        return True
    else:
        return False
def login_required(func):
    def wrapper(*args,**kwargs):
        global islogin
        if islogin:
            func(*args,**kwargs)
        else:
            #跳转到登录界面
            islogin=login()
            print ('result',islogin)
    return wrapper
@login_required
def pay(money):
    print ('正在付款,付款金额是:{}' .format(money))
    print ('付款中...')
    time.sleep(2)
    print ('付款完成')
pay(1000)
#第一次付款,调用login_requied,发现islogin=False,然后调用login,login后修改了全局变量,
# islogin=True,当再次pay(8000)的时候查到islogin=True,所以会只有8000付款成功
pay(8000)

应用场景

装饰器主要在以下情况下会被使用:

函数扩展:装饰器可以用于扩展函数的功能。通过在函数定义之前使用装饰器,可以在不修改原始函数代码的情况下添加额外的行为或功能。这样可以提高代码的可重用性和可维护性。

认证和授权:装饰器可以用于验证用户身份和权限控制。通过在需要进行身份验证或授权的函数上应用装饰器,可以确保只有经过验证的用户才能执行特定的操作。

缓存:装饰器可以用于实现函数的结果缓存。通过在函数执行前检查缓存并返回缓存结果,可以避免重复计算,提高程序的性能。

日志记录:装饰器可以用于记录函数的调用信息和执行日志。通过在函数执行前后添加日志记录的逻辑,可以方便地追踪函数的调用过程和输出结果,用于调试和分析。

输入验证和数据转换:装饰器可以用于验证函数的输入参数,并进行必要的数据转换或格式化。通过在函数执行前进行输入验证,可以确保函数接收到正确的参数,并在需要时对参数进行预处理。

性能分析:装饰器可以用于测量函数的执行时间和性能指标。通过在函数执行前后记录时间戳,并计算执行时间,可以评估函数的性能,并进行性能优化。

这些只是装饰器的一些常见应用场景,实际上,装饰器非常灵活,可以根据需求进行扩展和定制,以适应各种不同的编程需求。在Python等编程语言中,装饰器被广泛应用于实现各种功能和框架。它们提供了一种优雅而简洁的方式来修改和扩展代码的行为,同时保持代码的可读性和可维护性。

标签:函数,python,wrapper,print,hourse,装饰,def
From: https://www.cnblogs.com/liwenchao1995/p/17552912.html

相关文章

  • python arrow在图上绘制箭头
    importmatplotlib.pyplotaspltdefdrawArrow(A,B):fig=plt.figure()ax=fig.add_subplot(111)"""箭头起始位置(A[0],A[1])和终点位置(B[0],B[1])length_includes_head=True:表示增加的长度包含箭头部分head_width:箭头的宽度head_length......
  • Python学习——Day 5
    循环结构·反复做同一件事情的情况,称为循环·循环结构的流程图·循环的分类   ·while   ·for-in·语法结构  while条件表达式:            条件执行体(循环体)a=1#判断条件表达式whilea<10:#执行条件执行体print(a)a+=1......
  • python基础day44
    表关系(外键)建立一张表:emp1.表不清晰,现在到底是员工不还是部门表2.字段需要重复地写,浪费资源3.兼容性很差,牵一发而动全身如何解决以上问题?我们的思路是把一张表拆分成两张表:emp和depart部门表拆分之后最大问题就是两张表没有了任何的关系外键:其实就是通过字段可以查......
  • Python 并发编程之协程(转载)
    Python并发编程之协程https://www.cnblogs.com/linhaifeng/articles/7429894.html引子本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态cpu正在运行一个任务,会在两种情况下切走去执......
  • python 生成器
    目录python生成器推导式示例python生成器推导式通过列表生成式(列表推导式),我们可以直接创建一个列表但是受到内存限制,列表容量是有限的而且创建一个100万元素的列表,会占用很大的存储空如果我们只需要访问前面几个元素,那后面大多数元素占用的空间就白白浪费了所以,如果列表......
  • python 生成荣誉证书
    准备材料荣誉证书空白模板机构印章用户照片字体Xingkai.ttcSTHeitiMedium.ttcShiGongZiHei.otfpython代码importtimefromPILimportImage,ImageDraw,ImageFontfromdatetimeimportdatetimedefmake_badge(nickname,subject_name,id_no,dist,mark......
  • python之数据库: 约束条件
    约束条件"""约束条件的意思是,在数据类型的基础上再添加限制条件"""1.unsigned去除符号createtablet1(idintunsigned);2.zerofill3.notnull非空createtablet2(idint,namevarchar(16));以上例子15:#在mysql中,''和null不一样createtablet3(idi......
  • python 机器学习概述
    1.1人工智能概述1.2人工智能发展历程1.图灵测试2.达特矛斯会议(1956年,人工智能元年)1.3人工智能的主要分支1.人工智能、机器学习和深度学习的关系机器学习是人工智能的一个实现途径深度学习是机器学习的一个方法发展而来2.主要分支介绍......
  • C#开发中IronPython的使用
    目前的最新版本是:3.4.1安装Install-PackageIronPython如果需要使用标准库,则进行下面的安装Install-PackageIronPython.StdLib在C#程序中执行Python代码示例代码:vareng=IronPython.Hosting.Python.CreateEngine();varscope=eng.CreateScope();eng.Execute(@"......
  • 供应链产能受限型选址模型——Python实现
    选址问题是运筹学中非常经典的问题。选址问题是指在确定选址对象,选址目标区,成本函数以及存在何种约束条件的前提下,以总物流成本最低或总服务最优或社会效益最大化为总目标,以确定物流系统中物流节点的数量、位置,从而合理规划物流网络结构。设施选址问题(FacilityLocationProblem)自......