装饰器形成的过程
# 装饰器的作用
# 原则:开放封闭原则
#装饰器的固定模式
import time
# print(time.time()) #1551251400.416998 当前时间()
#让程序停5s
#语法糖: # 1)简单的装饰器
def timmer(f): #func #timmer就是一个装饰器函数
def inner():
start = time.time()
f() #用外部函数的变量f 是一个闭包 f()就是被装饰的函数
end = time.time()
print(end-start)
return inner #返回内部函数的名字(注意) @timmer #语法糖 @装饰器函数名,下面必须是被装饰的函数
def func(): #被装饰的函数
time.sleep(0.01)
print('大魔王法克儿')
return '新年好'
# func=timmer(func) #有了语法糖这一句就不用写了
func() #相当于是inner()
# 2) 带返回值的
def timmer(f): #func #timmer就是一个装饰器函数
def inner():
start = time.time()
ret =f() #用外部函数的变量f 是一个闭包 f()就是被装饰的函数
end = time.time()
print(end-start)
return ret #加了一个返回值
return inner #返回内部函数的名字(注意) @timmer #语法糖 @装饰器函数名,下面必须是被装饰的函数
def func(): #被装饰的函数
time.sleep(0.01)
print('大魔王法克儿')
return '新年好'
# func=timmer(func) #有了语法糖这一句就不用写了
ret=func() #相当于是inner()
print(ret)
# # 3) 加参数
def timmer(f): #func #timmer就是一个装饰器函数
def inner(a):
start = time.time()
ret =f(a) #用外部函数的变量f 是一个闭包 f()就是被装饰的函数
end = time.time()
print(end-start)
return ret #加了一个返回值
return inner #返回内部函数的名字(注意) @timmer #语法糖 @装饰器函数名,下面必须是被装饰的函数
def func(a): #被装饰的函数
time.sleep(0.01)
print('大魔王法克儿')
return '新年好'
# func=timmer(func) #有了语法糖这一句就不用写了
ret=func(1) #相当于是inner()
print(ret)
# 4) 加一堆参数 *args,**kwargs接受
def timmer(f): #func #timmer就是一个装饰器函数
def inner(*args,**kwargs):
start = time.time()
ret =f(*args,**kwargs) #f(1,2)
end = time.time()
print(end-start)
return ret #加了一个返回值
return inner #返回内部函数的名字(注意) @timmer #语法糖 @装饰器函数名,下面必须是被装饰的函数
def func(a,b): #被装饰的函数
time.sleep(0.01)
print('大魔王法克儿')
return '新年好' @timmer #语法糖 @装饰器函数名,下面必须是被装饰的函数
def func(a): #被装饰的函数
time.sleep(0.01)
print('大魔王法克儿')
return '新年好' ret=func(1,2) #相当于是inner()
ret=func(1,b=2)
print(ret)

装饰器的作用

#在不想修改函数的调用方式 但是还想再原来的函数前后添加功能
# timmer就是一个装饰器函数,只是对一个函数,有一些装饰作用
# 原则:开放封闭原则
#开放:对扩展是开放的
#封闭:对修改是封闭的

装饰器的固定模式

def wrapper(f): #装饰器函数,f是被装饰的函数
def inner(*args,**kwargs):
'''在被装饰函数之前要做的事情'''
ret = f(*args,**kwargs) #被装饰的函数
'''在被装饰函数之后要做的事情'''
return ret
return inner @wrapper #语法糖 @+装饰器函数名
def func(a,b): #被装饰的函数
print('大魔王法克儿')
return '新年好'

执行顺序

装饰器想当与一个中介,

python之路day11--装饰器形成的过程、作用、装饰器的固定模式的更多相关文章

  1. Python之路Day11

    函数名的第一类对象及使用 当作值,赋值给变量 def func(): print(1) print(func) #查看函数的内存地址 a=func print(a) a() 可以当作容器中的元素 de ...

  2. 小白学习Python之路---py文件转换成exe可执行文件

    一.背景 今天闲着无事,写了一个小小的Python脚本程序,然后给同学炫耀的时候,发现每次都得拉着其他人过来看着自己的电脑屏幕,感觉不是很爽,然后我想着网上肯定有关于Python脚本转换成可执行文件的 ...

  3. python之路-Day11

    引子 到目前为止,我们已经学了网络并发编程的2个套路, 多进程,多线程,这哥俩的优势和劣势都非常的明显,我们一起来回顾下 协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程: ...

  4. 【Python之路】特别篇--property()函数 和 @property 装饰符

    Python中有一个被称为属性函数(property)的小概念,它可以做一些有用的事情.在这篇文章中,我们将看到如何能做以下几点: 将方法转换为只读属性 重新实现一个属性的setter和getter方 ...

  5. 初学python之路-day11

    一.函数的参数:实参与形参 # 参数介绍: # 函数为什么要有参数:因为内部的函数体需要外部的数据 # 怎么定义函数的参数:在定义函数阶段,函数名后面()中来定义函数的参数 # 怎么使用函数的参数:在 ...

  6. Python中的装饰器的使用及固定模式

    装饰器的使用: 在不想修改函数的调用方式,但是想给函数添加内容的功能的时候使用     为什么使用装饰器: 软件实体应该是可扩展,而不可修改的.也就是说,对扩展是开放的,而对修改是封闭的. 因此,引出 ...

  7. python 之路,Day11 (下)- sqlalchemy ORM

    python 之路,Day11 - sqlalchemy ORM   本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 多对多关系 表结构设计作业 1. ORM ...

  8. python 之路,Day11(上) - python mysql and ORM

    python 之路,Day11 - python mysql and ORM   本节内容 数据库介绍 mysql 数据库安装使用 mysql管理 mysql 数据类型 常用mysql命令 创建数据库 ...

  9. python之路(九)-函数装饰器

    装饰器 某公司的基础业务平台如下: def f1(): print('这是f1业务平台') def f2(): print('这是f2业务平台') def f3(): print('这是f3业务平台' ...

随机推荐

  1. String-StringBuffer-StringBuilder的区别和源码分析

    一,String,StringBuffer,StringBuilder三者之间的关系 三个类的关系:StringBuffer和StringBuilder都继承自AbstractStringBuilde ...

  2. Gulp 前端优化

    使用方法: 下载 node.js , https://nodejs.org/en/,并安装 msi 一下命令都属于 dos 命令 node -v,npm -v,检验是否下载成功(出现版本号) 将 np ...

  3. HTML/CSS快速入门

    Web概念 JavaWeb 使用java语言开发基于互联网的项目 软件架构 C/S架构:Client/Server 客户端/服务器 用户本地有一个客户端程序,在远程有一个服务端程序 如QQ,英雄联盟. ...

  4. mssql sqlserver with cte表达式(递归)找出最顶值的方法分享

    摘要: 下文通过递归的方式找出最顶级部门的方法分享,如下所示: 实验环境:sql server 2008 R2 下文通过cte-with表达式实现递归,获取一个公司的顶级部门,如下所示 例:部门表 c ...

  5. The xp_cmdshell proxy account information cannot be retrieved or is invalid. Verify that the '##xp_cmdshell_proxy_account##' credential exists and contains valid information.

    In one of our recent migrations, we got the following error when the client tried to fire xp_cmdshel ...

  6. vue项目接口域名动态获取

    需求: 接口域名是从外部 .json 文件里获取的. 思路: 在开始加载项目前 进行接口域名获取,然后重置 接口域名的配置项. 实现: 1.config/index.js 文件 进行基础配置 impo ...

  7. java基础-jdk工具包

    1. 标准工具 这些工具都是JDK提供的,通常都是长期支持的工具,JDK承诺这些工具比较好用.不同系统.不同版本之间可能会有差异,但是不会突然就有一个工具消失. 1.1 基础包 (extcheck, ...

  8. Infiniband 网络性能测试

    1.带宽测试   在server端执行 [ibtests]# ib_send_bw -a -c UD -d mlx4_0 -i 1 ---------------------------------- ...

  9. 算法01 C语言设计

    8.21 #include <stdio.h> void bubbleSort(int **p, int n); int main(void){ int a[100]; int *b[10 ...

  10. js 对象 类型转换

    对象不相等 var o = {x: 1}, p = {x: 1}; console.log(o == p); console.log(o === p); var arr1 = [], arr2 = [ ...