装饰器

1.装饰器是在不改变原函数的执行的情况下为原函数增额外的功能。

简单版装饰器
import time
def func1():
print('执行速度')
def timmer(f):
start_time=time.time()
f()
time.sleep(0.3)
end_time=time.time()
print('此函数的执行效率%s'% (end_time-start_time))
f1=func1
func1=timmer
func1(f1)
import time
def timmer1(f): #f接收的是@timmer下面原函数的函数名func1
def inner():
f()
start_time=time.time()
time.sleep(0.3)
end_time=time.time()
print('此函数的执行效率%s' % (end_time - start_time))
return inner @timmer1
def func1():
print('测试速度') func1() 执行结果:
测试速度
此函数的执行效率0.30037736892700195

2.被装饰函数带参数的装饰器

# import time
# def timmer(f):#f=func1=inner
# def inner(*args,**kwargs):
# start_time=time.time()
# f(*args,**kwargs) #func1((*args,**kwargs))
# time.sleep(0.3)
# end_time=time.time()
# print('此函数的执行效率%s'% (end_time-start_time))
# return inner
# @timmer
# def func1(a,b,c,d): #timmer(func1)
# print(a,b,c,d)
# print('测试效率')
# func1(1,2,3,4)

3.装饰器模版

def wrapper(func):
def inner(*args,**kwargs):
ret=func(*args,**kwargs)
return ret
return inner @wrapper
def func(a,b):
print(666)
func(1,2,3)

4.带参数的装饰器

import time
def timmer(*args,**kwargs):
def wrapper(f):
def inner(*args,**kwargs):
if flag:
start_time=time.time()
ret=f(*args,**kwargs)
time.sleep(0.3)
end_time=time.time()
print('此函数的执行效率%f' %(end_time-start_time))
else:
ret=f(*args,**kwargs)
return ret
return inner
return wrapper
flag=True #flag=False 关掉装饰器
@timmer(flag) # 两步:1.把timmer(flag)当成一个普通话函数传给def timmer(),返回wrapper 2.变成@wrapper装饰器
def func1():
print(666)
func1() 执行结果:
666
此函数的执行效率0.300240

5.多个装饰器

def wrapper1(func):# func=f=inner1
def inner1():
print('wrapper1,before func') #2
func()
print('wrapper1,after func') #3
return inner1
def wrapper2(func): # func=inner1=inner2
def inner2():
print('wrapper2,before func') #1
func()
print('wrapper2,after func') #4
return inner2
@wrapper2 # f = wrapper2(f) 里面的f==inner1 外面的f == inner2
@wrapper1 # f = wrapper1(f) 里面的f==函数名f 外面的f == inner1
def f():# f=inner1
print('in f')
f() #f=inner1=inner2 执行结果:
wrapper2,before func
wrapper1,before func
in f
wrapper1,after func
wrapper2,after func

Python基础—装饰器(Day11)的更多相关文章

  1. python基础——装饰器

    python基础——装饰器 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. >>> def now(): ... print('2015-3-25 ...

  2. python基础—装饰器

    python基础-装饰器 定义:一个函数,可以接受一个函数作为参数,对该函数进行一些包装,不改变函数的本身. def foo(): return 123 a=foo(); b=foo; print(a ...

  3. python 基础——装饰器

    python 的装饰器,其实用到了以下几个语言特点: 1. 一切皆对象 2. 函数可以嵌套定义 3. 闭包,可以延长变量作用域 4. *args 和 **kwargs 可变参数 第1点,一切皆对象,包 ...

  4. day5学python 基础+装饰器内容

    基础+装饰器内容 递归特性# 1.必须有一个明确的结束条件# 2.每次进入更深一层递归时,问题规模相比上次递归应有所减少# 3.递归效率不高 def run(n): print(n) if int(n ...

  5. Python自动化 【第四篇】:Python基础-装饰器 生成器 迭代器 Json & pickle

    目录: 装饰器 生成器 迭代器 Json & pickle 数据序列化 软件目录结构规范 1. Python装饰器 装饰器:本质是函数,(功能是装饰其它函数)就是为其他函数添加附加功能 原则: ...

  6. python基础 (装饰器,内置函数)

    https://docs.python.org/zh-cn/3.7/library/functions.html 1.闭包回顾 在学习装饰器之前,可以先复习一下什么是闭包? 在嵌套函数内部的函数可以使 ...

  7. python基础-装饰器,生成器和迭代器

    学习内容 1.装饰器 2.生成器 3.迭代器 4.软件目录结构规范 一:装饰器(decorator) 1.装饰器定义:本质就是函数,用来装饰其他函数,即为其他函数添加附加功能. 2.装饰器原则:1)不 ...

  8. python基础===装饰器@property 的扩展

    以下来自Python 3.6.0 Document: class property(fget=None, fset=None, fdel=None, doc=None) Return a proper ...

  9. <Python基础>装饰器的基本原理

    1.装饰器 所谓装饰器一般是对已经使用(上线)的函数增加功能. 但是因为一般的大公司的严格按照开放封闭原则(对扩展是开放的,对修改是封闭的),不会让你修改原本的函数. 装饰器就是在不改变原本的函数且不 ...

随机推荐

  1. vue2.0与vue3.0项目创建

    脚手架安装与卸载 安装 npm install -g vue-cli //or npm install -g @vue/cli 卸载 npm uninstall -g vue-cli //or npm ...

  2. CTF中的变量覆盖问题

    0x00 前言 最近在干代码审计,于是就把之前学习的CTF题目中有关变量覆盖的题目结合下进一步研究. 通常将可以用自定义的参数值替换原有变量值的情况称为变量覆盖漏洞.经常导致变量覆盖漏洞场景有:$$使 ...

  3. HttpRunner3的HTTP请求是怎么发出去的

    在HttpRunner3的示例代码中,发送HTTP请求的代码是这样写的: from httprunner import HttpRunner, Config, Step, RunRequest, Ru ...

  4. Selenium2+python自动化65-js定位几种方法总结

    Selenium2+python自动化65-js定位几种方法总结   前言 本篇总结了几种js常用的定位元素方法,并用js点击按钮,对input输入框输入文本 一.以下总结了5种js定位的方法 除了i ...

  5. Linux命令(2)--cp拷贝、mv剪切、head、tail追踪、tar归档

    文章目录 一.知识回顾 ls cd 二.Linux基本操作(二) 1.cp 拷贝 2.mv 移动(剪切) 3.head 头部 4.tail 追踪(尾部) 5.tar 归档 查看 压缩 解压 总结 一. ...

  6. JDK并发工具类

    在JDK的并发包里提供了几个非常有用的并发工具类.CountDownLatch.CyclicBarrier和Semaphore工具类提供了一种并发流程控制的手段,Exchanger工具类则提供了在线程 ...

  7. 解决Post请求中文乱码问题

    解决Post请求中文乱码问题 req.setChracterEncoding()要在获取请求参数前调用才有效,不然还是乱码

  8. zabbix_proxy3.4安装

    server ip:172.16.2.116 proxy ip:172.16.2.241 1.创建proxy数据库,proxy用户 mysql> create database zabbix_p ...

  9. zabbix-server3.4安装

    1.安装yum源 rpm -ivh http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-1.el7.noarch.rp ...

  10. Go语言切片一网打尽,别和Java语法傻傻分不清楚

    前言 我总想着搞清楚,什么样的技术文章才算是好的文章呢?因为写一篇今后自己还愿意阅读的文章并不容易,暂时只能以此为目标努力. 最近开始用Go刷一些题,遇到了一些切片相关的细节问题,这里做一些总结.切片 ...