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. 74CMS漏洞打包(从老博客转)

    引子 这套CMS是上个月中做的审计,总共找到几个后台漏洞,可后台getshell,一个逻辑漏洞可任意发短信,还有一个前台注入漏洞.不过发到了某平台上之后,审核又要求我提交利用的poc,所以懒得发去了, ...

  2. Jsp Layout 布局页

    本文章仅用于知识记录 /WEB-INF/tags/layout.tag <%@ tag language="java" pageEncoding="UTF-8&qu ...

  3. [洛谷P1966] 火柴排队

    题目链接: 火柴排队 题目分析: 感觉比较顺理成章地就能推出来?似乎是个一眼题 交换的话多半会往逆序对上面想,然后题目给那个式子就是拿来吓人的根本没有卵用 唯一的用处大概是告诉你考虑贪心一波,很显然有 ...

  4. 微信小程序page的生命周期和音频播放及监听

    一.界面的生命周期 /** * 监听页面加载, * 页面加载中 */ onLoad:function(){ var _this = this console.log('index---------on ...

  5. Jeecg-Boot前后端分离,针对敏感数据,加密传递方案

    # 针对敏感数据,加密传递方案 第一步: 在vue页面引入aesEncrypt.js encryption方法.示例代码: import { encryption } from '@/utils/en ...

  6. 如何使用Pig集成分词器来统计新闻词频?

    散仙在上篇文章中,介绍过如何使用Pig来进行词频统计,整个流程呢,也是非常简单,只有短短5行代码搞定,这是由于Pig的内置函数TOKENIZE这个UDF封装了单词分割的核心流程,当然,我们的需求是各种 ...

  7. oracle日志

    UTL_FILE.FOPEN(location in varchar2, filename in varchar2, open_mode in varchar2) return FILE_TYPE; ...

  8. CodeChef:Chef and Problems(分块)

    CodeChef:Chef and Problems 题目大意 有一个长度为n的序列$a_1,a_2,……,a_n$,每次给出一个区间[l,r],求在区间内两个相等的数的最远距离($max(j-i,满 ...

  9. [NOI2003]逃学的小孩【观察+树的直径】

    Online Judge:Bzoj1509,Luogu P4408 Label:观察,树的直径 题目描述 输入 第一行是两个整数N(\(3≤N≤200000\))和M,分别表示居住点总数和街道总数.以 ...

  10. Luogu P2845 [USACO15DEC]Switching on the Lights 开关灯(bfs)

    P2845 [USACO15DEC]Switching on the Lights 开关灯 题意 题目背景 来源:usaco-2015-dec \(Farm\ John\)最近新建了一批巨大的牛棚.这 ...