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
# 开始计算......
# 计算结束。。
#

【python之路24】装饰器的更多相关文章

  1. 小白的Python之路 day4 装饰器前奏

    装饰器前奏: 一.定义: 1.装饰器本质是函数,语法都是用def去定义的 (函数的目的:他需要完成特定的功能) 2.装饰器的功能:就是装饰其他函数(就是为其他函数添加附加功能) 二.原则: 1. 不能 ...

  2. python之路之装饰器

    一 装饰器进化之路1) import time def index(): start_time=time.time() time.sleep() print('welcome to index wor ...

  3. [Python之路] 使用装饰器给Web框架添加路由功能(静态、动态、伪静态URL)

    一.观察以下代码 以下来自 Python实现简易HTTP服务器与MINI WEB框架(利用WSGI实现服务器与框架解耦) 中的mini_frame最后版本的代码: import time def in ...

  4. 小白的Python之路 day4 装饰器高潮

    首先装饰器实现的条件: 高阶函数+嵌套函数 =>装饰器 1.首先,我们先定义一个高级函数,去装饰test1函数,得不到我们想要的操作方式 import time #定义高阶函数 def deco ...

  5. Python中利用函数装饰器实现备忘功能

    Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下   " ...

  6. python函数与方法装饰器

    之前用python简单写了一下斐波那契数列的递归实现(如下),发现运行速度很慢. def fib_direct(n): assert n > 0, 'invalid n' if n < 3 ...

  7. guxh的python笔记三:装饰器

    1,函数作用域 这种情况可以顺利执行: total = 0 def run(): print(total) 这种情况会报错: total = 0 def run(): print(total) tot ...

  8. python设计模式之内置装饰器使用(四)

    前言 python内部有许多内建装饰器,它们都有特别的功能,下面对其归纳一下. 系列文章 python设计模式之单例模式(一) python设计模式之常用创建模式总结(二) python设计模式之装饰 ...

  9. python 3.x 的装饰器笔记

    今天学到了python的装饰器,感觉这个东西还是稍微有些复杂,所以记录下来,方便以后的查找.虽然标题是python 3.x的装饰器,但是我也没有怎么用过python 2.x,感觉上应该是和python ...

  10. python 中多个装饰器的执行顺序

    python 中多个装饰器的执行顺序: def wrapper1(f1): print('in wrapper1') def inner1(*args,**kwargs): print('in inn ...

随机推荐

  1. Nodejs之路(四)—— MongoDB&MySQL

    一.MongoDB 1.1概述 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案.MongoDB 是一个介于关系数据库和非 ...

  2. Cmd使用方式--命令行运行程序

    工具用惯却不知道如何去描述什么用,总感觉自己学东西用东西零零散散不系统,心虚!下面总结下自己使用cmd的几种方式. 1 => cmd,command,是window系统下命令提示符,是一种com ...

  3. [Baltic2009]beetle【区间Dp】

    Online Judge:Bzoj1761 Label:区间Dp 题目描述 在一条直线上有N个点,每个点M升水. 一个虫子在坐标轴0点上,它每个单位时间移动一格,每个点的水每单位时间消失1升. 问虫子 ...

  4. OpenGL 鼠标交互响应事件

    OpenGL 鼠标.键盘交互响应事件 先来一个样例: uses gl,glu,glut; procedure InitEnvironment;cdecl; begin glClearColor();/ ...

  5. loj2290 随机二分图

    题意:有一个左右各n个点的二分图,对于连边组有一些性质:1号组的一条边,有50%的概率出现.2号组两条边,有50%的概率同时出现,50%的概率同时不出现.3号组两条边,有50%的概率出现第一条,有50 ...

  6. 五. Arrow Function 箭头函数

    箭头函数三大好处: 1. 简明的语法 举例: 如果只有一个参数,可以不加(),多个参数用 "," 隔开 2. 隐式返回 首先说下什么是显示返回,显示返回就是 return 加上你要 ...

  7. redis笔记_源码_内存分配

    文件:zmoalloc.h zmoalloc.c 1.求两个整数的余数 eg: 求_n对sizeof(long)的余数(_n&(sizeof(long)-1)), 性能提升为50%-100% ...

  8. 廖雪峰Java14Java操作XML和JSON-1XML-2DOM

    XML是一种数据表示形式. 可以描述非常复杂的数据数据结构 用于传输和传输数据 DOM:Document Object Model DOM模型就是把XML文档作为一个树形结构,从根结点开始,每个节点都 ...

  9. 廖雪峰Java11多线程编程-2线程同步-3死锁

    1.线程锁可以嵌套 在多线程编程中,要执行synchronized块: 必须首先获得指定对象的锁 Java的线程锁是可重入的锁.对同一个对象,同一个线程,可以多次获取他的锁,即同一把锁可以嵌套.如以下 ...

  10. csps模拟测试74梦境,玩具,飘雪圣域题解

    题面:https://www.cnblogs.com/Juve/articles/11679226.html 梦境: 其实还是挺水的,排序错了过不了样例,打了个二分图匹配就跑了 #include< ...