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业务平台' ...
随机推荐
- 如何利用GitHub设计一个炫酷的个人网站(含代码)
1.在开始制作之前我们先预览一下我的网站吧! 1.方式一: 由于是手机版的所以用手机访问下面的链接体验比较好一点: https://tom-shushu.github.io/MyWeb.github. ...
- 1.4 GPU分析
shader 加宏 编译说明glsl
- python自定义pi函数的代码
下边内容是关于python自定义pi函数的内容. def pi(): # Compute digits of Pi. # Algorithm due to LGLT Meertens. k, a, b ...
- Netty中ByteBuf的引用计数线程安全的实现原理
原文链接 Netty中ByteBuf的引用计数线程安全的实现原理 代码仓库地址 ByteBuf 实现了ReferenceCounted 接口,实现了引用计数接口,该接口的retain(int) 方法为 ...
- Nginx设置Https反向代理,指向Docker Gitlab11.3.9 Https服务
目录 目录 1.GitLab11.3.9的安装 2.域名在阿里云托管,申请免费的1年证书 3.Gitlab 的 https 配置 4.Nginx 配置 https,反向代理指向 Gitlab 配置 目 ...
- Vue2.0 --- vue-cli脚手架中全局引入JQ
第一步:安装jQuery npm/cmpn方式安装(默认安装1.7.X版本的JQ) npm/cnpm install jQuery 如果想安装更高版本的JQ那么可以选择在package.json文件下 ...
- Scrapy框架-Spider
目录 1. Spider 2.Scrapy源代码 2.1. Scrapy主要属性和方法 3.parse()方法的工作机制 1. Spider Spider类定义了如何爬取某个(或某些)网站.包括了爬取 ...
- [LeetCode] 21. 合并两个有序链表
题目链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/ 题目描述: 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定 ...
- QinQ 简介
QinQ 是一种二层隧道协议,通过将用户的私网报文封装上外层 VLAN Tag,使其携带两层 VLAN Tag 穿越公网,从而为用户提供了一种比较简单的二层VPN隧道技术.QinQ 的实现方式可分为两 ...
- JS JavaScript模块化(ES Module/CommonJS/AMD/CMD)
前言 前端开发中,起初只要在script标签中嵌入几十上百行代码就能实现一些基本的交互效果,后来js得到重视,应用也广泛起来了, jQuery,Ajax,Node.Js,MVC,MVVM等的助力也使得 ...