“”“”

什么是装饰器?

"""

还是通过一个例子来慢慢说明

先看下面的例子

def func_1(x):

  return x*2

def fun_2(x):

  return x*3

def fun_3(x, y i, j):

  return x(i)+y(j)

r = func_3(func_1,func_2,2,3)  #把函数引用作为参数传递给func_3

print(r)

#通过上面的例子明白:函数的参数可以是函数,也可以是一个类,其实可以是任何类型

def runtime_noargs():

  pass

@runtime_noargs #这里就是一个装饰器,装饰器就是一个闭包函数,回忆下上篇文章的闭包感念

def function_demo1()

  print("demo1函数被运行")

那么是如何把某种功能附加给上面的装饰器,让它帮助被装饰的函数实现某种功能的呢?

我们先对装饰器函数进行修改

import time

def runtime_noargs(function_name): #将来这里的function_name接受被装饰的函数名

  def wrapper():

    start_time = time.time()

    function_name() #在这里执行被装饰器装饰的函数

    end_time = time.time()

    print(end_time - start_time)

  return wrapper

@runtime_noargs #当装饰器用来装饰某函数时,被装饰的函数名被自动传参给装饰器函数

def function_demo1()

  time.sleep(1)

  print("demo1函数被运行")

function_demo1() #可以使用debug单步运行模式来看看函数的具体执行步骤

上面是一个没有参数的函数,通过装饰器来装饰的,那么有参数的函数如何通过装饰器来装饰呢?

def args_is_string(function_name):

  def wrapper(a):

    t=type(a)

    if not isinstance(t(), str):

      print("参数错误")

    else:

      funtion_name(a)

  return wrapper

@args_is_string #通过一个装饰器函数来限制被装饰函数输入的参数只能是字符串

def function_demo2(args): #函数里的参数和装饰器函数里的内部函数wrapper参数对应,这样              print(args)                 #args参数就自动传给了装饰器中内部函数的参数a上,这是python的                                               #规则

 

function_demo2("aaaa")

上面的例子中,被装饰的函数只能传一个参数,那么要传多个参数呢?

通过一个例子来说明如何实现多个参数的函数的是如何被装饰的

def many_args(function_name):

  def wrapper(*args):

    print(*args)   #不定长参数这里一个*,打印时需要

    function_name(*args)

  return wrapper

@many_args

def function_demo3(*args)  #*args可以接受不定长参数,可以接受若干个参数

  print(*args)

function_demo3(1,2,3,4,5,6)

如果关键字参数这种怎么办呢?

def dict_args(funtion_name):

  def wrapper(**kwargs):

    print(kwargs) #不定长字典类型的参数,两个*,在打印时不需要加*,注意和上面的区别

    function_name(**kwargs)

  return wrapper

@dict_args

def function_demo4(**kwargs): #**kwargs用来传不定长的字典形式参数

  print(kwargs)

funtion_demo4(name = "fang", age = 10, address = "北京")

如果是混合型的参数呢?

def combo_args(function_name):

  def wrapper(*args, **kwargs):

    print(*args,kwargs)

  return warpper

@combo_args

def function_demo5(*args, **kwargs):

  pass

function_demo5(1,2,name="fang",age = "10",address="北京")

上面是装饰器的基本使用方法。

再介绍一种进阶版的装饰器,监控函数运行是否超时

def max_runtime(function_time);

  def out_wrapper(funtion_name):

    def wrapper(*args, **kwargs):

      start_time = time.time()

      i = function_name(*args,**kwargs)  #如果函数需要返回值,这里必须由接住函数                                                                                  #返回值

      end_time = time.time()

      use_time = end_time - start_time

      if use_time > timeout:

        raise RuntimeError("函数运行超时")

      return i  #这里必须把函数返回值返回去,即便在被装饰的函数本体里已经写了                                           #return

    return wrapper

  return out_wrapper

@max_runtime(timeout=1)

def function_demo6(*args, **kwargs):

  time.sleep(2)

  print("demo6运行")

  return 1

result = function_demo6()

print(result)

上面的这个例子告诉我们,装饰器后面带参数时,装饰器的闭包函数体就要多写一层函数,见上图之间的对应关系。

python中装饰器(语法糖)概念的更多相关文章

  1. python中装饰器的原理以及实现,

    python版本 3.6 1.python的装饰器说白了就是闭包函数的一种应用场景,在运用的时候我们遵循 #开放封闭原则:对修改封闭,对拓展开放 2.什么是装饰器 #装饰他人的器具,本身可以是任意可调 ...

  2. 8.Python中装饰器是什么?

    Python中装饰器是什么? A Python decorator is a specific change that we make in Python syntax to alter functi ...

  3. python装饰器 语法糖

    简介: 装饰器(Decorators)是 Python 的一个重要部分.简单地说:他们是修改其他函数的功能的函数. 比如说我们写flask,路由就是用装饰器定义的.如果写权限控制,那么权限控制一般也是 ...

  4. Python中装饰器(转)

    本文由 伯乐在线 - 7even 翻译,艾凌风 校稿.未经许可,禁止转载!英文出处:Simeon Franklin.欢迎加入翻译组. 好吧,我标题党了.作为 Python 教师,我发现理解装饰器是学生 ...

  5. Python核心技术与实战——十四|Python中装饰器的使用

    我在以前的帖子里讲了装饰器的用法,这里我们来具体讲一讲Python中的装饰器,这里,我们从前面讲的函数,闭包为切入点,引出装饰器的概念.表达和基本使用方法.其次,我们结合一些实际工程中的例子,以便能再 ...

  6. Python中装饰器的用法

    定义: 装饰器本身就是一个函数 为其他函数提供附加功能 不改变源代码 不改变原调用方式 装饰器=高阶函数+嵌套函数 知识点: 函数本身就是一个变量(意味着可以被复制给一个变量:test=test(1) ...

  7. python中装饰器修复技术

    python装饰器@wraps作用-修复被装饰后的函数名等属性的改变 Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变), 为了 ...

  8. python中装饰器的执行细节

    本文代码借用 廖雪峰的python教程(官网:http://www.liaoxuefeng.com/) 不了解装饰器的可以先看教程 直接上带参数装饰器的代码 def log(text): def de ...

  9. python中装饰器的原理

    装饰器这玩意挺有用,当时感觉各种绕,现在终于绕明白了,俺滴个大爷,还是要慢慢思考才能买明白各种的真谛,没事就来绕一绕 def outer(func): def inner(): print(" ...

随机推荐

  1. oracle索引2

    问什么问题? 索引有什么代价?哪些场景下你需要建索引?或者有时候反过来问,哪些场景下不推荐建索引. 建好索引之后,怎么才能最高效地利用索引?或者反过来问,请说出一个无法有效利用已建索引的案例. 索引的 ...

  2. 数据结构C++实现-第一章 绪论

    1.1 计算机与算法 1.1.3 起泡排序 void bubbleSort(int a[], int n) { for(bool sorted=false; !sorted; --n) { sorte ...

  3. S03_CH01_AXI_DMA_LOOP 环路测试

    S03_CH01_AXI_DMA_LOOP 环路测试 1.1概述 本课程是本季课程里面最简单,也是后面DMA课程的基础,读者务必认真先阅读和学习. 本课程的设计原理分析. 本课程是设计一个最基本的DM ...

  4. nginx浏览器开启密码验证

    如果我们在 nginx 下搭建了一些站点,但是由于站点内容或者流量的关系,我们并不想让所有人都能正常访问,那么我们可以设置访问认证.只有让用户输入正确的用户名和密码才能正常访问.效果如下: 在 ngi ...

  5. Python 字符串——巧取值和列表——巧取值 对比

    Python 字符串——巧取值和列表——巧取值 对比 1.字符串取值实例: samp_string = "Whatever you are, be a good one." for ...

  6. JS基础_返回值的类型

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. # 机器学习算法总结-第五天(降维算法PCA/SVD)

  8. Flutter 34: 图解自定义 View 之 Canvas (一)

    小菜最近在学习自定义 View,刚了解了一下 Paint 画笔的神奇之处,现在学习一下 Canvas 画布的神秘之处.Flutter 提供了众多的绘制方法,小菜接触不深,尽量都尝试一下. Canvas ...

  9. 10.自定义EL函数和自定义标签

    需要在JSP页面中进行一些常见逻辑操作(如对字符串进行操作),首先考虑是否可以用到sun公司提供的EL函数库(fn.tld)和JSTL 核心标签库 如果sun公司的EL函数库没有或者无法满足,就需要自 ...

  10. 记一次线上dubbo服务超时和线程池满问题排查

    线上某dubbo服务A调用dubbo服务B的接口X方法,调用端A日志中出现了很多超时的情况,提供端B该接口X超时时间设置为60s: 查看提供端B的日志,报了很多线程池满的异常: Caused by: ...