博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
装饰器
阅读量:4993 次
发布时间:2019-06-12

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

1 def outer(func): 2     def inner(): 3         print("hello") 4         print("hello") 5         #func为原f的函数 6         r=func()  # r=none 7         print("end") 8         print("rend") 9         return r10     return inner11 @outer #装饰器的本质将原函数封装到新函数,执行outer函数,并县城将其下面的的函数名做为参数传到到12 #传到func中,将outer的返回值重新赋值 给f1=outer的返回值 inner就是地13 #只要应用装饰器,函数就被重新定义,重新定义为inner函数内层的函数14 def f():15 16     print("F1")17 f()

一个装饰器执行过程,先将outer,f函数载入内存,当f()时候就执行@outer,将下面的f当作参数传入outer函数,outer函数中又定义了一个inner函数,执行两个print("hello") 接着执行func()这个其实就是调用原f()函数,将返回值 给r,没有r返回none,接着执行下面

print("end")语句,当inner函数执行完后,面outer返回一个inner函数所在内存指的位置还不是带有括号,否则执行,

内存有三块函数,outer , inner,f分别指不三块内存地址,当执行f()则outer(func)这个时func也指向f 所指的函数,相当于outer(f),执行时返回一个inner所指的函数,这个时候f()则换成inner()执行的函数,而在inner()函数中执行到func()则相当于f()执行,返回的值r接着在执行后面的语句,反回一个r值,其实就是相当于f()返回的值给了r

有参数的

1 def outer(func): 2     def inner(a1,a2): 3         print("hello") 4         print("hello") 5         #func为原f的函数 6         r=func(a1,a2) # r=none 7         print("end") 8         print("end") 9         return r10     return inner11 12 13 @outer14 def f1(a1,a2):15     return a1+a216 f1(1,2)

 多个参数(有时传一个,传两个,有时传三个)

1 def outer(func): 2     def inner(*args): 3         print("hello") 4         print("hello") 5         #func为原f的函数 6         r=func(*args) # r=none 7         print(r) 8         print("end") 9         print("end")10         return r11     return inner12 @outer13 def f1(a1,a2):14     return a1+a215 f1(1,2)

多个参数,有字典

 

1 def outer(func): 2     def inner(*args,**kargs): 3         print("hello") 4         print("hello") 5         #func为原f的函数 6         r=func(*args,**kargs) # r=none 7         print(r) 8         print("end") 9         print("end")10         return r11     return inner12 @outer13 def f1(a1,a2):14     return a1+a215 f1(1,2)

 多个装饰器加在一个函数

def outer0(func):    def inner(*args,**kwargs):        print("sbsb")        r = func(*args,**kwargs)        return r    return innerdef outer(func):    def inner(*args,**kargs):        print("hello")        print("hello")        #func为原f的函数        r=func(*args,**kargs) # r=none        print(r)        print("end")        print("end")        return r    return inner@outer0  #先执行第一个装饰器@outer   #执行第二个装饰器def f1(a1,a2):    return a1+a2f1(1,2)

运行结果

sbsb

hello
hello
3
end
end

 

转载于:https://www.cnblogs.com/wang43125471/p/7625492.html

你可能感兴趣的文章
Java设计模式系列 — 构造器模式
查看>>
MySQL执行计划explain的key_len解析
查看>>
Windows Phone开发(9):关于页面状态 转:http://blog.csdn.net/tcjiaan/article/details/7292160...
查看>>
android 通过数组,流播放声音的方法
查看>>
Spring入门篇
查看>>
JAVA遇见HTML——JSP篇(JSP状态管理)
查看>>
启动eclipse出现错误Java was started but returned exit =一个数字
查看>>
myBatis模糊查找
查看>>
数据结构与算法之五 链接列表
查看>>
java 对象数组
查看>>
设计模式读书笔记-单件模式(创建型模式)
查看>>
Oracle——热备份
查看>>
Vue路由history模式踩坑记录:nginx配置解决404问题
查看>>
c# 多张图片合成一张图片
查看>>
使用SQL Server 2008的事务日志传送功能备份数据库(logshiping)
查看>>
AngularJS多个ng-app只解析第一个的问题
查看>>
强制修改常量的值
查看>>
Grunt 初体验
查看>>
hive跑mapreduce报java.lang.RuntimeException: Error in configuring object
查看>>
ArcGIS中的坐标系统定义与投影转换方法
查看>>