day11.装饰器初识
1.开放封闭原则
原则: 开放封闭原则,对扩展是开放的,对修改是封闭的。
封版概念:当写好一个功能以后,就不可以再修改此函数,避免下面一系列的调用产生错误。
因此产生了装饰器
2.装饰器形成过程
我们来模拟一个发明汽车的过程。首先封装了一个汽车,汽车可以跑起来就是已经封装好的功能函数
按照开放封闭思想,此函数不能再修改,且调用是 car()直接调用
def car():
print('小汽车跑起来')
car()
社会进步了,某天人们不满足现状,想计算一下汽车跑一段路程的时间,然后想增加了计时功能。
那么怎么将这个计时功能加入到汽车里面呢?
def car_time(fun):
start = time.time()
fun()
stop = car_time()
times = stop - start
print(times)
这里用到了闭包思想,返回函数功能。
def car_time(fun):
def inner():
start = time.time()
fun()
stop = car_time()
times = stop - start
print(times)
return inner
最终得到了
import time
def car():
time.sleep(2)
print('小汽车跑起来') def car_time(fun):
def inner():
start = time.time()
fun() # 函数的嵌套
stop = time.time()
times = stop - start
print('汽车用时:',times)
return inner # 返回函数内存地址给car_time car = car_time(car) #为了让原来的函数原封不动
car()
小汽车跑起来
汽车用时: 2.0002264976501465
上面函数是不是看起来舒服多了,我们在不动原函数的基础上加入了计时功能。
语法糖
语法糖是啥呢,所有用户执行计时功能时,不能都 加 car = car_time(car) 这个赋值吧,要不被人骂死
然后产生了语法糖,用了美滋滋,就可以省去函数赋值这一步了
import time def car_time(fun):
def inner():
start = time.time()
fun()
stop = time.time()
times = stop - start
print('汽车用时:',times)
return inner @car_time # 没错这个就是语法糖,@装饰器函数名
def car():
time.sleep(2)
print('小汽车跑起来') car()
带参数的装饰器
总所周知函数是可以传参数的,那么装饰器装饰的函数怎么传参数呢
import time
def car_time(fun): # 此处的fun = car
def inner(a):
start = time.time()
ret = fun(a) # 参数需要fun(a)执行,这里用ret接收car的返回值
stop = time.time()
times = stop - start
print('汽车用时:',times)
return ret # 此处将返回值返回
return inner @car_time
def car(a):
time.sleep(2)
print('小汽车跑起来',a) car('hello')
# 分析可知道。这个car = cat_time(car), car()其实是调用inner函数
小汽车跑起来 hello
汽车用时: 2.000110387802124
上述是加一个参数的函数,如果我们想加多个,甚至是列表,接受指定键值对呢。所以产生了默认的
装饰器公式
def car_time(fun): # 装饰器函数,fun是被装饰的函数
def inner(*args,**kwargs): # 接受传进来的任意参数
pass # 被装饰函数之前要做的事
ret = fun(*args,**kwargs) # 执行 装饰函数 + 参数
pass # 被装饰函数之后要做的事
return ret
return inner # @car_time
def car(): # 此处传参
pass car = car_time(car)
car() # 此处传参
day11.装饰器初识的更多相关文章
- python 全栈开发,Day11(函数名应用,闭包,装饰器初识,带参数以及带返回值的装饰器)
一.函数名应用 函数名是什么?函数名是函数的名字,本质:变量,特殊的变量. 函数名(),执行此函数. python 规范写法 1. #后面加一个空格,再写内容,就没有波浪线了. 2.一行代码写完,下面 ...
- python3 装饰器初识 NLP第三条
还是先抄一条NLP假设... 三,有效果比有道理更重要 光说做法有道理或者正确而不顾是否有效果,是在自欺欺人. 在三赢(我好,人好,世界好)的原则基础上追求效果,比坚持什么是对的更有意义. 说道理 ...
- python之装饰器初识
一.@abstractmethod 1.抽象类的作用:规范编程模式 多人开发.复杂的需求.后期的扩展 是一种用来帮助我们完成规范化的手段 2.如何定义抽象类 1,from abc import ABC ...
- day11 装饰器---函数的使用方法
这个是一个难点,以后面试会经常出现的,要搞懂! 装饰器升级版,进阶内容1: def outer(flag): def wrapper(func): def inner(*args,**kwargs): ...
- Day 12 开放封闭原则,装饰器初识
nonlocal关键字 # 作用:将 L 与 E(E中的名字需要提前定义) 的名字统一# 应用场景:如果想在被嵌套的函数中修改外部函数变量(名字)的值# 案例:def outer(): n ...
- day11:装饰器
1,引子,计算函数的运行时间: import time def func(): time.sleep(0.01) # 为了计算运行时间差的时候有值 print("func") de ...
- python基础一 day11 装饰器复习
# 复习# 讲作业# 装饰器的进阶 # functools.wraps # 带参数的装饰器 # 多个装饰器装饰同一个函数# 周末的作业 # 文件操作 # 字符串处理 # 输入输出 # 流程控制 # 装 ...
- 1.16 Python基础知识 - 装饰器初识
Python中的装饰器就是函数,作用就是包装其他函数,为他们起到修饰作用.在不修改源代码的情况下,为这些函数额外添加一些功能,像日志记录,性能测试等.一个函数可以使用多个装饰器,产生的结果与装饰器的位 ...
- python 装饰器-初识
一.装饰器的形成过程 1.函数无参数,无返回值 import time def f1(): # 无参数,无返回值 time.sleep(1) print("Hello, World!&quo ...
随机推荐
- JMeter测试(菜鸟级,高手莫点)
干了这么多年开发,多线程测试都是自己写程序,都不知道还有JMeter这玩意,莫笑莫笑 一个简单的测试计划如下: 在[测试计划]下创建[线程组],线程组下[HTTP请求]和[查看结果树]是必须的,[HT ...
- 【UR #7】水题走四方
题目描述 今天是世界水日,著名的水题资源专家蝈蝈大臣发起了水题走四方活动,向全世界发放成千上万的水题. 蝈蝈大臣是家里蹲大学的教授,当然不愿意出门发水题啦!所以他委托他的助手欧姆来发. 助手欧姆最近做 ...
- [HAOI2008]糖果传递 结论题
题目描述 有\(n(n<1000000)\)个小朋友坐成一圈,每人有\(a_i\)个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为\(1\),求使所有人糖果数相等的最小代价. 暴力 ...
- pycharm pip安装包
第一种方式为命令行模式,在pycharm界面按alt+F12调出命令行窗口,在窗口内输入pip install matplotlib回车即可,如图1所示 方法二:使用菜单项File——settings ...
- np.array.all()和np.array.any()函数
np.array.all()是对np.array中所有元素进行与操作,然后结果返回True或False np.array.any()是对np.array中所有元素进行或操作,然后结果返回True或Fa ...
- ES6部分知识点总结
注:本文通过yck前端面试小册学习整理而得,记录下来供自己查阅 1.var 变量提升 使用var声明的变量,声明会被提升到作用域的顶部 举几个例子: eg1: console.log(a) // un ...
- 2017-12-19python全栈9期第四天第二节之列表的增删查改之删除的pop和del和remove和clear
#!/user/bin/python# -*- coding:utf-8 -*-li = ['zs','ls','ww','zl']# name = li.pop(1) #按索引位置删除有返回值# n ...
- nginx缓存设置(expires)
一.expires功能说明 nginx缓存的设置可以提高网站性能,对于网站的图片,尤其是新闻网站,图片一旦发布,改动的可能是非常小的,为了减小对服务器请求的压力,提高用户浏览速度,我们可以通过设置ng ...
- 1.3浅谈Spring(IOC容器的实现)
这一节我们来讨论IOC容器到底做了什么. 还是借用之前的那段代码 ClassPathXmlApplicationContext app = new ClassPathXmlApplicationCon ...
- CMDB资产管理系统开发【day27】:理解RESTful架构
理解RESTful架构 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(hig ...