1、装饰器的应用场景

通常IT公司的程序开发是分工的,例如某公司某个部门负责底层函数的开发,另一个部门利用其函数实现高级功能,那么如果负责底层开发的函数需要改动,一般来说不会直接在函数上进行修改,通常利用装饰器在函数外部进行修改。

2、装饰器之@的用法

#!usr/bin/env python
# -*- coding:utf-8 -*-
#装饰器
def outer(func):
func()
return lambda :123 #1、首先执行outer函数,并且将其下面的函数名作为参数传给outer
#2、将outer的返回值重新赋值给f1,即f1 = outer的返回值
@outer
def f1():
print("F1") re = f1()
print(re)

3、装饰器的主要作用:原函数不变的情况下,可以在函数的前面或后面增加其功能。

下面的代码:

#!usr/bin/env python
# -*- coding:utf-8 -*-
def outer(func):
def inner1():
print('start')
print('start')
re = func()
print('end')
print('end')
return re
return inner1 def f1():
print('F1') f1 = outer(f1)
f1()

上面的代码等价于装饰器:

#!usr/bin/env python
# -*- coding:utf-8 -*-
def outer(func):
def inner1():
print('start')
print('start')
re = func()
print('end')
print('end')
return re
return inner1
@outer
def f1():
print('F1') f1()

执行过程如下图:

4、含有两个参数的装饰器

#!usr/bin/env python
# -*- coding:utf-8 -*-
#含有两个参数的函数
def outer(func):
def inner(a1,a2):
print('开始计算.......')
re = func(a1,a2)
print('计算完毕。')
return re
return inner
@outer
def add(a1,a2):
print("复杂的计算")
return a1+a2 r = add(1,3)
print(r)

5、任意个参数的装饰器

#!usr/bin/env python
# -*- coding:utf-8 -*- def outer(func):
def inner(*args,**kwargs):
print("开始计算......")
r = func(*args,**kwargs)#可以为任何参数,python会自动处理参数
print("计算结束。。")
return r
return inner
@outer
def f1(a1,a2):
return a1+a2
@outer
def f2(a1,a2,a3):
return a1+a2+a3
@outer
def f3(a1):
return a1+1 r1 = f1(10,20)
r2 = f2(10,20,30)
r3 = f3(10)
print(r1,r2,r3)

6、一个函数可以拥有多个装饰器,多个装饰器从上到下执行,例如:

#!usr/bin/env python
# -*- coding:utf-8 -*-
#一个函数可以拥有多个装饰器
def outer_0(func):
def inner(*args,**kwargs):
print(3.5)
r = func(*args,**kwargs)
return r
return inner
def outer(func):
def inner(*args,**kwargs):
print("开始计算......")
r = func(*args,**kwargs)#可以为任何参数,python会自动处理参数
print("计算结束。。")
return r
return inner
@outer_0
@outer
def f1(a1,a2):
return a1+a2
@outer
def f2(a1,a2,a3):
return a1+a2+a3
@outer
def f3(a1):
return a1+1 r1 = f1(10,20)
print(r1) # 结果输出:
# 3.5
# 开始计算......
# 计算结束。。
#

最新文章

  1. Python - 类与对象的方法
  2. 【转】简析 .NET Core 构成体系
  3. js中 字符串与Unicode 字符值序列的相互转换
  4. Unique Binary Search Trees [LeetCode]
  5. UVa1606 UVaLive3259 FZU1309 HDU1661 POJ2280 ZOJ2390 Amphiphilic Carbon Molecules
  6. XJOI网上同步训练DAY6 T1
  7. linux内核基础(系统调用,简明)
  8. C++——STL中三种顺序容器的简要差别
  9. Android Studio(IDEA)快速代码模版使用
  10. webpack 搭建问题汇总
  11. ios网络编程(入门级别)-- 基础知识
  12. js+php实现文件上传显示文件上传进度条的插件
  13. Swift 无操作时自动登出
  14. yaml文件转properties和properties转yaml
  15. 一个简单题,引发的思索 + nyoj 1189
  16. js autoComplate
  17. 在java中public void与public static void有什么区别 ?
  18. 成功配置TOMCAT的LOG4J日志系统,格式:HTML+每天以YYYY-MM-DD.LOG命名的日志文件
  19. Hbase数据IO
  20. jQuery选择器和选取方法.RP

热门文章

  1. iOS开发系列-NSURLConnection
  2. webservice、httpClient、dubbo的区别
  3. spring自定义bean工厂模式解耦
  4. 【学术篇】洛谷1550——打井Watering Hole
  5. T2960 全民健身【思维Dp,预处理,差分优化】
  6. 廖雪峰Java14Java操作XML和JSON-1XML-2DOM
  7. MySQL其他和备份
  8. 高斯消元+期望dp——light1151
  9. 利用eclipse通过mybatis进行查询汉字字符时候无法显示结果,但是直接通过cmd窗口可以显示的解决方法
  10. LUOGU P2764 最小路径覆盖问题 (最小路径点覆盖)