博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python学习第一天---装饰器
阅读量:6354 次
发布时间:2019-06-22

本文共 2452 字,大约阅读时间需要 8 分钟。

装饰器:装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象

python函数(python3.7)

1.函数作用域LEGB

  L > E > G > B

  L:local  -函数内部作用域

  E:enclosing  -函数内部与内嵌函数之间

  G:global  -全局变量

  B:build-in  -内置作用域

1 passline = 60  # 全局变量2 3 def func(val):4     if val >= passline:5         print('pass')6     else:7         print('failed')8 func(86)

 

2.闭包理解与使用

  函数实质与属性

    1.函数是一个对象

    2.函数执行完成之后内部变量回收

    3.函数属性

    4.函数返回值

passline = 60def func(val):    if val >= passline:        print('pass')    else:        print('failed')    def in_func():        print(val)    return in_funcf = func(68)f()
def set_passline(passline):    def cmpp(val):        if val>=passline:;            print('pass')        else:            print('failed')   return cmpp

 

3.装饰器(本质是一个闭包)

装饰器形成的过程

  

装饰器的作用

  不想修改函数的调用方式,但是还想在原来的函数前后添加功能

  timer就是一个装饰器函数,只有对一个函数有一些装饰作用

  @timer  魔法糖(调用装饰器的方式)

 原则:开放封闭原则

    开放:对扩展时开放的

    封闭:对修改是封闭的

装饰器的固定模式

def wrapper(f):  #装饰器函数,f是被装饰的函数    def inner(*args,**kwargs):      “”“在被装饰函数之前要做的事”“”        ret = f(*args,**kwargs)  #被装饰的函数      “”“在被装饰函数之后要做的事”“”        return ret    return inner@wrapper  # @装饰器函数  func = wrapper(func)
def func(*args,**kwargs):   #被装饰函数   time.sleep(0.01)   print("hello world")   return "新年好" func()   #实际上执行的inner()

 

装饰器进阶

  functools.wraps

    构造完美装饰器

    

# 当要获取func.__name__,这样没有改变原函数的__name__def wrapper(func):    @wraps(func)    def inner(*args,**kwargs):        ret = func(*args,**kwargs)        return ret    return inner@wrapperdef func():    pass func.__name__

 

 

 

  带参数的装饰器

    # @warpper -->  @warpper(argument)

    # 三层嵌套

 

# 带参数的装饰器def outer(flag):    def timer(func):        def inner(*args,**kwargs):        if flag:          print("执行函数之前要做的")        ret = func(*args,**kwargs)        if flag:          print("执行函数之后要做的")            return retreturn inner    return timer@outer(False)def func():    passfunc()

 

  多个装饰器装饰同一个函数

 

def warpper1(func):    def inner(*args,**kwargs):        print("wrapper1 , before func!")        re = func(*args,**kwargs)        print("warpper1 , after func!")      return re    return innerdef warpper2(func):    def inner(*args,**kwargs):        print("wrapper2 , before func!")        re = func(*args,**kwargs)        print("warpper2 , after func!")      return re    return inner@warpper1@warpper2def func():    passfunc()

1.执行warpper1中func之前的内容

2.执行warpper2中func之前的内容

3.执行warpper2中func之后的内容

4.执行warpper1中func之后的内容

  

 

 

   

 

转载于:https://www.cnblogs.com/cjj426890/p/9914553.html

你可能感兴趣的文章
[日常] Go语言圣经--示例: 并发的Echo服务
查看>>
BZOJ1969: [Ahoi2005]LANE 航线规划(LCT)
查看>>
linux内存管理之malloc、vmalloc、kmalloc的区别
查看>>
GreenDao 数据库升级 连接多个DB文件 或者指定不同的model&dao目录
查看>>
M1卡破解(自从学校升级系统之后,还准备在研究下)【转】
查看>>
vue 访问子组件示例 或者子元素
查看>>
linux内核--自旋锁的理解
查看>>
银行卡的三个磁道
查看>>
OpenSSL 提取 pfx 数字证书公钥与私钥
查看>>
Keepalived详解(四):通过vrrp_script实现对集群资源的监控【转】
查看>>
CollapsingToolbarLayoutDemo【可折叠式标题栏,顺便带有CardView卡片式布局】
查看>>
CentOS7.4安装配置mysql5.7 TAR免安装版
查看>>
解决IE二级链接无法打开故障
查看>>
Windows phone应用开发[16]-数据加密
查看>>
SQL Server 迁移数据到MySQL
查看>>
通用数据压缩算法简介
查看>>
The next Industry Standard in IT Monitoring, a python implementation Nagios like tool --- Shinken
查看>>
(笔记)找工作,该怎么进补
查看>>
div的显示和隐藏以及点击图标的更改
查看>>
(轉貼) Ubuntu將在ARM平台netbook上現身 (SOC) (News) (Linux) (Ubuntu)
查看>>