【python之路24】装饰器
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】装饰器的更多相关文章
- 小白的Python之路 day4 装饰器前奏
装饰器前奏: 一.定义: 1.装饰器本质是函数,语法都是用def去定义的 (函数的目的:他需要完成特定的功能) 2.装饰器的功能:就是装饰其他函数(就是为其他函数添加附加功能) 二.原则: 1. 不能 ...
- python之路之装饰器
一 装饰器进化之路1) import time def index(): start_time=time.time() time.sleep() print('welcome to index wor ...
- [Python之路] 使用装饰器给Web框架添加路由功能(静态、动态、伪静态URL)
一.观察以下代码 以下来自 Python实现简易HTTP服务器与MINI WEB框架(利用WSGI实现服务器与框架解耦) 中的mini_frame最后版本的代码: import time def in ...
- 小白的Python之路 day4 装饰器高潮
首先装饰器实现的条件: 高阶函数+嵌套函数 =>装饰器 1.首先,我们先定义一个高级函数,去装饰test1函数,得不到我们想要的操作方式 import time #定义高阶函数 def deco ...
- Python中利用函数装饰器实现备忘功能
Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下 " ...
- python函数与方法装饰器
之前用python简单写了一下斐波那契数列的递归实现(如下),发现运行速度很慢. def fib_direct(n): assert n > 0, 'invalid n' if n < 3 ...
- guxh的python笔记三:装饰器
1,函数作用域 这种情况可以顺利执行: total = 0 def run(): print(total) 这种情况会报错: total = 0 def run(): print(total) tot ...
- python设计模式之内置装饰器使用(四)
前言 python内部有许多内建装饰器,它们都有特别的功能,下面对其归纳一下. 系列文章 python设计模式之单例模式(一) python设计模式之常用创建模式总结(二) python设计模式之装饰 ...
- python 3.x 的装饰器笔记
今天学到了python的装饰器,感觉这个东西还是稍微有些复杂,所以记录下来,方便以后的查找.虽然标题是python 3.x的装饰器,但是我也没有怎么用过python 2.x,感觉上应该是和python ...
- python 中多个装饰器的执行顺序
python 中多个装饰器的执行顺序: def wrapper1(f1): print('in wrapper1') def inner1(*args,**kwargs): print('in inn ...
随机推荐
- Linux 容器 vs 虚拟机——谁更胜一筹
自从Linux上的容器变得流行以来,了解Linux容器和虚拟机之间的区别变得更加棘手.本文将向您提供详细信息,以了解Linux容器和虚拟机之间的差异. Linux容器vs虚拟机 - 应用程序与操作系统 ...
- Hibernate的多对一映射
一.创建Java工程,新建Lib文件夹,加入Hibernate和数据库(如MySql.Oracle.SqlServer等)的Jar包,创建 hibernate.cfg.xml 文件,并配置,配置项如下 ...
- 2019-6-23-天河2-程序-version-GLIBCXX_3.4.21-not-found-解决方法
title author date CreateTime categories 天河2 程序 version GLIBCXX_3.4.21 not found 解决方法 lindexi 2019-06 ...
- 关系型数据库——MySQL
[MySQL架构图] MySQL简要架构图如下图所示,引擎层以插件方式集成了不同的存储引擎,它们共用Server层对外提供服务. 连接器:用于连接管理,进行身份认证及权限相关的管理.(登录MySQ ...
- php访问其他网站接口
使用函数: file_get_contents($url); 传入接口url及其参数:如 $url="http://192.168.1.1/test.jsp?id=1&type=2 ...
- springboot实现转发和重定向
1.转发 方式一:使用 "forword" 关键字(不是指java关键字),注意:类的注解不能使用@RestController 要用@Controller @Reques ...
- Ubuntu下使用SSH 命令用于登录远程桌面
https://blog.csdn.net/yucicheung/article/details/79427578 问题描述 做DL的经常需要在一台电脑(本地主机)上写代码,另一台电脑(服务器,计算力 ...
- linux top命令VIRT,RES,SHR,DATA的含义(转)
linux top命令VIRT,RES,SHR,DATA的含义 字体: 大 小Posted by 佚名 | tags: top VIRT RES SHR VIRT:virtual memory ...
- VUE下echarts宽度响应式
window.addEventListener("resize", () => { myChart2.resize();});
- vuex基础知识总结
项目中要求添加vuex,根据学习我这个小白总结了一点自己的心得,供大家参考 在学习之前,要知道两件事 为什么要用vuex?vuex要什么场景下应用? 简单点解释一下 1.项目中应用了vue脚手架之后, ...