一、简单的装饰器

1.为什么要使用装饰器呢?

  装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展

  装饰器的本质:就是一个闭包函数

那么我们先来看一个简单的装饰器:实现计算每个函数的执行时间的功能

import time
def wrapper(func):
def inner():
start=time.time()
func()
end=time.time()
print(end-start)
return inner

def hahaha():
time.sleep(1)
print('aaaaa')
hahaha=wrapper(hahaha)
hahaha()

简单的装饰器

上面的功能有点不简介,不完美,下面就引进了语法糖。

import time
def wrapper(func):
def inner():
start=time.time()
func()
end=time.time()
print(end-start)
return inner
@wrapper
def kkk():#相当于kkk=wrapper(kkk)
print('aaaaa')
kkk()

装饰器-------语法糖

以上的装饰器都是不带参数的函数,现在装饰一个带参数的该怎么办呢?

import time
def timer(func):
def inner(*args,**kwargs):
start = time.time()
re = func(*args,**kwargs)
end=time.time()
print(end- start)
return re
return inner

@timer #==> func1 = timer(func1)
def func1(a,b):
print('in func1')
print(a,b)

@timer #==> func1 = timer(func1)
def func2(a):
print('in func2 and get a:%s'%(a))
return 'fun2 over'

func1(1,2)
print(func2('aaaaaa'))

原函数带多个参数的装饰器

import time
def timer(func):
def inner(*args,**kwargs):
start = time.time()
re = func(*args,**kwargs)
end=time.time()
print(end - start)
return re
return inner

@timer #==> func1 = timer(func1)
def jjj(a):
print('in jjj and get a:%s'%(a))
return 'fun2 over'

jjj('aaaaaa')
print(jjj('aaaaaa'))

带返回值的装饰器

二、开放封闭原则

1.对扩展是开放的

2.对修改是封闭的

 三、装饰器的固定结构

import time
def wrapper(func): # 装饰器
def inner(*args, **kwargs):
'''函数执行之前的内容扩展'''
ret = func(*args, **kwargs)
'''函数执行之前的内容扩展'''
return ret
return inner

@wrapper # =====>aaa=timmer(aaa)
def aaa():
time.sleep(1)
print('fdfgdg')
aaa()

四、带参数的装饰器

带参数的装饰器:就是给装饰器传参

        用处:就是当加了很多装饰器的时候,现在忽然又不想加装饰器了,想把装饰器给去掉了,但是那么多的代码,一个一个的去闲的麻烦,那么,我们可以利用带参数的装饰器去装饰它,这就他就像一个开关一样,要的时候就调用了,不用的时候就去掉了。给装饰器里面传个参数,那么那个语法糖也要带个括号。在语法糖的括号内传参。在这里,我们可以用三层嵌套,弄一个标识为去标识。如下面的代码示例

# 带参数的装饰器:(相当于开关)为了给装饰器传参
# F=True#为True时就把装饰器给加上了
F=False#为False时就把装饰器给去掉了
def outer(flag):
def wrapper(func):
def inner(*args,**kwargs):
if flag:
print('before')
ret=func(*args,**kwargs)
print('after')
else:
ret = func(*args, **kwargs)
return ret
return inner
return wrapper

@outer(F)#@wrapper
def hahaha():
print('hahaha')

@outer(F)
def shuangwaiwai():
print('shuangwaiwai')

hahaha()
shuangwaiwai()

给装饰器加参数

 五、多个装饰器装饰一个函数

def qqqxing(fun):
def inner(*args,**kwargs):
print('in qqxing: before')
ret = fun(*args,**kwargs)
print('in qqxing: after')
return ret
return inner

def pipixia(fun):
def inner(*args,**kwargs):
print('in qqxing: before')
ret = fun(*args,**kwargs)
print('in qqxing: after')
return ret
return inner
@qqqxing
@pipixia
def dapangxie():
print('饿了吗')
dapangxie()

'''
@qqqxing和@pipixia的执行顺序:先执行qqqxing里面的 print('in qqxing: before'),然后跳到了pipixia里面的
print('in qqxing: before')
ret = fun(*args,**kwargs)
print('in qqxing: after'),完了又回到了qqqxing里面的 print('in qqxing: after')。所以就如下面的运行结果截图一样
'''

多个装饰器装饰一个函数

上例代码的运行结果截图

六、统计多少个函数被装饰了的小应用

统计多少个函数被我装饰了
l=[]
def wrapper(fun):
l.append(fun)#统计当前程序中有多少个函数被装饰了
def inner(*args,**kwargs):
# l.append(fun)#统计本次程序执行有多少个带装饰器的函数被调用了
ret = fun(*args,**kwargs)
return ret
return inner

@wrapper
def f1():
print('in f1')

@wrapper
def f2():
print('in f2')

@wrapper
def f3():
print('in f3')
print(l)

统计多少个函数被装饰了

python装饰器(基础中的重点)的更多相关文章

  1. Python装饰器基础

    一.Python装饰器引入 讲 Python 装饰器前,我想先举个例子,虽有点污,但跟装饰器这个话题很贴切. 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个 ...

  2. Python装饰器基础及运行时间

    一.装饰器基础 装饰器是可调用的对象,其参数是另一个函数(被装饰的函数).装饰器可能会处理被装饰的函数,然后把他返回,或者将其替换成另一个函数或可调用对象. eg:decorate装饰器 @decor ...

  3. python装饰器基础及应用

    一.简介 装饰器是是修改其它函数功能的函数:其意义是让其他函数在不修改任何代码的前提下增加额外功能 二.数据类型 首先我们来看一段简单的代码: from types import MethodType ...

  4. Python基础(五) python装饰器使用

    这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 # -*- coding:gbk -*- '''示例1: 最简单的函数,表示调用了两次 ...

  5. Python开发基础-Day7-闭包函数和装饰器基础

    补充:全局变量声明及局部变量引用 python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量 global关键字用来在函数或其 ...

  6. Python 装饰器装饰类中的方法

    title: Python 装饰器装饰类中的方法 comments: true date: 2017-04-17 20:44:31 tags: ['Python', 'Decorate'] categ ...

  7. python装饰器中@wraps作用--修复被装饰后的函数名等属性的改变

    Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),为了不影响,Python的functools包中提供了一个叫wraps的de ...

  8. [python 基础]python装饰器(一)添加functools获取原函数信息以及functools.partial分析

    python装饰器学习的时候有两点需要注意一下 1,被装饰器装饰的函数取其func.__name__和func.func_doc的时候得到的不是被修饰函数的相关信息而是装饰器wrapper函数的doc ...

  9. python装饰器在接口自动化测试中的应用

    在讲解装饰器在接口自动化测试项目的应用之前,我们先来介绍一下python装饰器到底是个什么 装饰器 说装饰器就不得不提一下函数这个一等公民了,在python中函数有几个特性先来了解一下 函数的一些特性 ...

  10. day20-Python运维开发基础(装饰器 / 类中的方法 / 类的方法变属性)

    1. 装饰器 / 类中的方法 / 类的方法变属性 # ### 装饰器 """ 定义:装饰器用于拓展原来函数功能的一种语法,返回新函数替换旧函数 优点:在不更改原函数代码的 ...

随机推荐

  1. linux学习笔记(1):

    一.Linux系统简介 1.什么是linux Linux是一个免费的.多用户.多任务的操作系统,其运行方式.功能和UNIX系统很相似,但Linux系统的稳定性.安全性与网络功能是许多商业操作系统所无法 ...

  2. Node 12 值得关注的新特性

    前言 时隔一年,Node.js 12 如约而至,正式发布第一个 Current 版本. 该版本带来了诸如: V8 更新带来好多不错的特性. HTTP 解析速度提升. 启动速度大幅提升. 更好的诊断报告 ...

  3. 线程屏障CyclicBarrier实现原理

    生产环境中,存在需要等待多个线程都达到某种状态后,才继续运行的情景.并发工具CyclicBarrier就能够完成这种功能.本篇从源码方面,简要分析CyclicBarrier的实现原理. 使用示例 pu ...

  4. xargs 将标准输入转换成命令行参数

    1. 命令功能 xargs 命令过滤器,接收管道或者标准输入传递的数据转换成xargs命令. 2. 语法格式 xargs [option] xargs  选项 参数 参数说明 -n 指定每行的最大参数 ...

  5. rmdir 删除空目录

    1. 命令功能 rmdir:删除空目录,当目录不为空时,命令不能起作用. 2. 语法格式 rmdir  [option]  directory rmdir  选项  空目录 参数 参数说明 -p 递归 ...

  6. leetcode 实现-168.Excel表列名称

    168.Excel表列名称 描述 给定一个正整数,返回它在 Excel 表中相对应的列名称. 例如, 1 -> A 2 -> B 3 -> C … 26 -> Z 27 -&g ...

  7. shell 数组中 @ 跟 * 的区别

    关于在shell脚本中数组变量中 “*”跟 “@” 区别 “*”当变量加上“” 会当成一串字符串处理. “@”变量加上“” 依然当做数组处理. 在没有加上“” 的情况下 效果是等效的. #!/bin/ ...

  8. php 调用远程url

    // ; Whether to allow the treatment of URLs (like http:// or ftp://) as files. // ; http://php.net/a ...

  9. AOP技术介绍--(.Net平台AOP技术研究)

    4.1.Net平台AOP技术概览 .Net平台与Java平台相比,由于它至今在服务端仍不具备与unix系统的兼容性,也不具备类似于Java平台下J2EE这样的企业级容器,使得.Net平台在大型的企业级 ...

  10. jQuery ajax上传文件实例

    jQuery ajax上传文件实例 <form id="form" enctype="multipart/form-data"><input ...