Python进阶(六)----装饰器

一丶开放封闭原则

开放原则:

​ 增加一些额外的新功能

封闭原则:

​ 不改变源码.以及调用方式

二丶初识装饰器

装饰器:

​ 也可称装饰器函数,诠释开放封闭原则,装饰器的本质是闭包

###普通版装饰器
import time
def timmer(x): # x 接收的原函数的内存地址
def inner():
start_time=time.time()
x() # 执行 原函数
print(f'执行效率{time.time()-start_time}')
return inner def index():
time.sleep(2)
print(f'欢迎访问本站博客园') index=timmer(index) #将timmer函数执行的结果返回,付给index变量
index() #这里执行的inner函数 ###标准版 @timmer是语法糖(黏贴在被装饰函数,先于执行被装饰函数),装饰器函数必写在被装饰函数之上.
import time
def timmer(func): # 此时 func 就是一个自由变量
def inner():
start_time = time.time()
func() # func 是timmer函数传递过来的index原函数的内存地址
print(f'执行效率 {time.time() - start_time}')
return inner @timmer # 等同于 index=timmer(index) 往下读一行
def index():
time.sleep(2)
print('登录成功') index() #这里执行的inner函数

三丶被装饰函数带返回值

###需求被装饰函数有返回值

import time
def timmer(func): # 这里argv 接收的真正要执行的原函数.
def inner():
start_time=time.time()
var=func()
print(f'{time.time()-start_time},{args[0]},{args[1]}') return var #原函数有返回值, 这里是执行完 inner函数 中真正要返回的原函数执行的结果
return inner @timmer
def index(*args,**kwargs):
time.sleep(2)
print('进入到网页index页面')
return True # 原函数 最重返回的结果是 True print(index(1,2)) # 这里是执行 inner方法

四丶被装饰函数带参数

###需求 被装饰函数有参数
import time
def timmer(func): def inner(*args,**kwargs): # inner方法执行,接收的参数, 将形参参数聚合 args=(1,2)
# 函数定义时 , * ,** 代表聚合 start_time=time.time() res=func(*args,**kwargs) # 执行真正的原函数, 将参数打散 func(1,2)
# 函数执行时 ,* ,** 代表打散 print(f'{time.time()-start_time} 这是{args[0]}') return res return inner @timmer
def index(args):
time.sleep(2)
print(f'welcome {args}')
return True index('都来看')

五丶标准终终结版装饰器

######  装饰器原版   ####
def warpper(func):
def inner(*args,**kwargs):
'''被装饰器之前的操作'''
ret=func(*args,**kwargs)
'''被装饰函数之后的操作'''
return ret
return inner ####拓展版 计算index函数执行的效率 import time
def timmer(func): def inner(*args,**kwargs): # inner方法执行,接收的参数, 将形参参数聚合 args=(1,2)
# 函数定义时 , * ,** 代表聚合 start_time=time.time() res=func(*args,**kwargs) # 执行真正的原函数, 将参数打散 func(1,2)
# 函数执行时 ,* ,** 代表打散 print(f'{time.time()-start_time} 这是{args[0]}') return res #原函数有返回值, 这里是执行完 inner函数 中真正要返回的原函数执行的结果 return inner #返回inner函数, 给index重新赋值. @timmer #语法糖,等同于 index=timmer(index) , 把index原函数作为形参传递给timmer函数func
def index(args): # 原函数具有传参的功能
time.sleep(2)
print(f'welcome {args}')
return True # 原函数具有返回值的功能 index('都来看') # 执行的是inner函数,把参数传递给inner函数, ####装饰器:
#1.必须存在嵌套函数中
#2.必须存在内存函数对外层函数(非全局变量)的引用
#3.必须具有return 返回嵌套函数的内存地址(嵌套函数名字)
#4.内层函数必须能够接收原函数传递的参数
#5.内存函数执行完必须返回原函数要返回的结果 ####装饰器约束:
#1.不得更改源码,
#2.不能更改调用方式 ####应用场景:
#用户登录验证
#打印日志

Python进阶(六)----装饰器的更多相关文章

  1. python进阶04 装饰器、描述器、常用内置装饰器

    python进阶04 装饰器.描述器.常用内置装饰器 一.装饰器 作用:能够给现有的函数增加功能 如何给一个现有的函数增加执行计数的功能 首先用类来添加新功能 def fun(): #首先我们定义一个 ...

  2. Python进阶之装饰器

    函数也是对象 要理解Python装饰器,首先要明白在Python中,函数也是一种对象,因此可以把定义函数时的函数名看作是函数对象的一个引用.既然是引用,因此可以将函数赋值给一个变量,也可以把函数作为一 ...

  3. Python进阶: Decorator 装饰器你太美

    函数 -> 装饰器 函数的4个核心概念 1.函数可以赋与变量 def func(message): print('Got a message: {}'.format(message)) send ...

  4. python进阶(三)~~~装饰器和闭包

    一.闭包 满足条件: 1. 函数内嵌套一个函数: 2.外层函数的返回值是内层函数的函数名: 3.内层嵌套函数对外部作用域有一个非全局变量的引用: def func(): print("=== ...

  5. [Python进阶]002.装饰器(1)

    装饰器(1) 介绍 HelloWorld 需求 使用函数式编程 加入装饰器 解析 介绍 Python的装饰器叫Decorator,就是对一个模块做装饰. 作用: 为已存在的对象添加额外功能. 与Jav ...

  6. python进阶:装饰器

    1.闭包 简单理解:闭包就是多层函数的嵌套,外层函数的返回值是内层函数的引用. def out_func(n): num = 100 def in_fucn(*args,**kwargs): # no ...

  7. Python进阶(装饰器)

    from datetime import datetime def log(func):#func表示装饰器作用于的函数 def wrapper(*args,**kw):#wrapper返回装饰器作用 ...

  8. Noah的学习笔记之Python篇:装饰器

    Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang  (http://www.cnblogs.com/noahzn/) ...

  9. 简单说明Python中的装饰器的用法

    简单说明Python中的装饰器的用法 这篇文章主要简单说明了Python中的装饰器的用法,装饰器在Python的进阶学习中非常重要,示例代码基于Python2.x,需要的朋友可以参考下   装饰器对与 ...

随机推荐

  1. linux下检查网络连通情况

    MTR是一种简单的跨平台命令行网络诊断工具,它将常用的traceroute和ping程序的功能组合到一个工具中. 与traceroute类似, mtr输出关于数据包从运行mtr的主机到用户指定的目标主 ...

  2. CatBoost使用GPU实现决策树的快速梯度提升CatBoost Enables Fast Gradient Boosting on Decision Trees Using GPUs

    python机器学习-乳腺癌细胞挖掘(博主亲自录制视频)https://study.163.com/course/introduction.htm?courseId=1005269003&ut ...

  3. Java一行代码

    1.整数格式化成0X 的形式字符串 String hour=String.format("%02d", txtWaringTime.getCurrentHour()); Strin ...

  4. jmeter beanshell 从文件中获取随机参数

    loadruner 参数化有个功能,可以设置在脚本每次出现参数时,自动更换参数值.在做jmeter自动化测试过程中,同一个请求中出现多个参数值,如一个接口可以添加n个信息的请求 [ { "n ...

  5. Java13新特性 -- ZGC:取消使用未使用的内存

    在JDK 11中,Java引入了ZGC,这是一款可伸缩的低延迟垃圾收集器,但是当时只是实验性的.号称不管你开了多大的堆内存,它都能保证在 10 毫秒内释放 JVM ,不让它停顿在那.但是,当时的设计是 ...

  6. roboware 常见操作和问题

    博客参考:https://blog.csdn.net/u013528298/article/details/88052470 1. build中错误位置定位方式 按住“CTRL”键并点击错误提示的链接 ...

  7. webService和Restful

    restful是一种架构风格,其核心是面向资源,更简单:而webService底层SOAP协议,主要核心是面向活动:两个都是通过web请求调用接口 RESTful是什么: 首先要了解什么是REST,R ...

  8. 【Layui】 layui表单必填项带*样式

    直接上代码 .layui-form-label.layui-required:after{ content:"*"; color:red; position: absolute; ...

  9. rocketmqy压测消费端解决源码中不能正常消费的问题

    因为近期在做rocketmq的性能压测,然后看到一些文章,提到用rocketmq中的自带的benchamark工具进行压测,因为我们公司是自己在做了一个二次封装,做了一层认证,所以工具还需要在改造,所 ...

  10. 测试面试题集锦----liunx与网络

    国庆完后就回深圳了,所以也要参加面试了,我大概收集了一些感觉可能会面试到的一些笔试题,给大家参考,答案不一定全对,分为liunx ,网络,mysql,编程题,我分别按分类补充,以后在继续补充 liun ...