python之路day11--装饰器形成的过程、作用、装饰器的固定模式
装饰器形成的过程
# 装饰器的作用
# 原则:开放封闭原则
#装饰器的固定模式
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--装饰器形成的过程、作用、装饰器的固定模式的更多相关文章
- Python之路Day11
函数名的第一类对象及使用 当作值,赋值给变量 def func(): print(1) print(func) #查看函数的内存地址 a=func print(a) a() 可以当作容器中的元素 de ...
- 小白学习Python之路---py文件转换成exe可执行文件
一.背景 今天闲着无事,写了一个小小的Python脚本程序,然后给同学炫耀的时候,发现每次都得拉着其他人过来看着自己的电脑屏幕,感觉不是很爽,然后我想着网上肯定有关于Python脚本转换成可执行文件的 ...
- python之路-Day11
引子 到目前为止,我们已经学了网络并发编程的2个套路, 多进程,多线程,这哥俩的优势和劣势都非常的明显,我们一起来回顾下 协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程: ...
- 【Python之路】特别篇--property()函数 和 @property 装饰符
Python中有一个被称为属性函数(property)的小概念,它可以做一些有用的事情.在这篇文章中,我们将看到如何能做以下几点: 将方法转换为只读属性 重新实现一个属性的setter和getter方 ...
- 初学python之路-day11
一.函数的参数:实参与形参 # 参数介绍: # 函数为什么要有参数:因为内部的函数体需要外部的数据 # 怎么定义函数的参数:在定义函数阶段,函数名后面()中来定义函数的参数 # 怎么使用函数的参数:在 ...
- Python中的装饰器的使用及固定模式
装饰器的使用: 在不想修改函数的调用方式,但是想给函数添加内容的功能的时候使用 为什么使用装饰器: 软件实体应该是可扩展,而不可修改的.也就是说,对扩展是开放的,而对修改是封闭的. 因此,引出 ...
- python 之路,Day11 (下)- sqlalchemy ORM
python 之路,Day11 - sqlalchemy ORM 本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 多对多关系 表结构设计作业 1. ORM ...
- python 之路,Day11(上) - python mysql and ORM
python 之路,Day11 - python mysql and ORM 本节内容 数据库介绍 mysql 数据库安装使用 mysql管理 mysql 数据类型 常用mysql命令 创建数据库 ...
- python之路(九)-函数装饰器
装饰器 某公司的基础业务平台如下: def f1(): print('这是f1业务平台') def f2(): print('这是f2业务平台') def f3(): print('这是f3业务平台' ...
随机推荐
- 【译】.NET Core 3.0 中的新变化
.NET Core 3.0 是 .NET Core 平台的下一主要版本.本文回顾了 .Net Core 发展历史,并展示了它是如何从基本支持 Web 和数据工作负载的版本 1,发展成为能够运行 Web ...
- 03 入门 - 安装MVC 5和创建应用程序
目录索引:<ASP.NET MVC 5 高级编程>学习笔记 本篇内容: 1. ASP.NET MVC 5的软件需求 2. 安装ASP.NET MVC 5 1)安装MVC 5开发组件 2)服 ...
- 从APP跳转到微信指定联系人聊天页面功能的实现与采坑之旅
起因: 最近做的APP中有一个新功能:已知用户微信号,可点击直接跳转到当前用户微信聊天窗口页面. 当时第一想法是使用无障碍来做,并且觉得应该不难,只是逻辑有点复杂.没想到最终踩了好多坑,特地把踩过的坑 ...
- Android设计模式总结
1.复合模式:三层架构.MVC.MVP.MVVM 2.设计模式-单例模式 配置类的使用. 3.设计模式-模板方法 通过抽象类或接口提前定义要实现的方法. 4.设计模式-观察者模式 消息的通知. 5.设 ...
- 为什么CynosDB叫真正的云原生数据库?
本文由腾讯云数据库发表 注:本文摘自2018年11月22日腾讯云数据库CynosDB新品发布会的演讲实录.随着互联网信息的发展,大家也对云这个词汇也不是特别陌生了,作为全球首选的云服务厂商之一的腾讯云 ...
- 利用WSUS部署更新程序
WSUS概述 为了让用户的windows系统与其他microsoft产品能够更安全,更稳定,因此microsoft会不定期在网站上推出最新的更新程序供用户下载与安装,而用户可以通过以下方式来取得这些程 ...
- anaconda的scikit-learn报错It seems that scikit-learn has not been built
我们在导入sklearn时往往会报错. import sklearn Traceback (most recent call last): File "<stdin>" ...
- Azure按订阅,资源组,资源类型导出所有资源powershell命令
一般可以借助powershell命令来读取资源:例如:1, 读取某个订阅下的资源:$subscriptionID = "xxxxxxxx"Set-AzureRmContext $s ...
- 多态练习题(通过UML建模语言来实现饲养员喂养动物)
项目需求如下图: package com.Summer_0428.cn; /** * @author Summer * 1.构建一个食物抽象类,Bone和Fish分别为其实现类,通过super传参. ...
- Python--day07(数据类型转换、字符编码)
昨天内容回顾 1. 深浅拷贝: 值拷贝:直接赋值,原列表中任何值发生改变,新列表的值都会发生改变. 浅拷贝:通过copy()方法,原列表中存放值的地址没有发生改变,但内部的值发生改变,新列表也随之改 ...