摘要:某公司的基础开发平台,有大概N多个函数,boss要求小A,为每个函数添加权限验证功能,而且要求不得修改函数内部结构,让小A尝试从代码外部入手,作为新手小A来讲,这无疑是一个巨大的工作量,难道TM的要一个一个加到里面不可么~~~~生无可恋的小A无奈的望着桌面,在扫过谷歌浏览器图标的那一刻,突然一紧,于是机智的打开谷歌搜索,欲寻到一个简单的方法,经过搜索在一个叫银角大王的lowB博客里面找到了一个叫做装饰器的东东,然后耐心的看了下去……

图解python装饰器的执行流程

 #装饰器的使用
# 自动执行outer函数并且将其下面的函数名f1当作参数传递
# 将outer函数的返回值,重新赋值给f1
# 1、遇到def outer(func) 加载到内存,跳过函数体
# 2、遇到@outer,将f1作为参数传入func中
# 3、遇到def inner():将函数加载到内存跳过函数体
# 4、遇到return inner,将inner函数作为整体,赋值给f1
# 5、遇到f1(),调用inner函数体,执行print(‘log’)
# 6、遇到return func() 执行作为参数传入func中的老的f1函数的函数体print('F1')
# 7、遇到return 'lululu'将lululu传回f1()中
def outer(func):
def inner():
print('log')
return func()
return inner
@outer
def f1():
print('F1')
return 'lululu'
print(f1())
>>>log
>>>F1
>>>lululu
#带参数的传递
def outer(func):
def inner(a):
print('before')
r=func(a)
print('after')
return r
return inner @outer
def f1(arg):
print(arg)
return 'lululu'
print(f1('huhuh'))
>>>before
>>>huhuh
>>>after
>>>lululu #万能参数传递
def outer(func):
def inner(*args,**kwargs):
print('before')
r=func(*args,**kwargs)
print('after')
return r
return inner
@outer
def f1(arg):
print('f1函数体',arg)
return 'lululu'
print('返回值',f1('huhuhu'))
>>>before
>>>f1函数体 huhuhu
>>>after
>>>返回值 lululu @outer
def f2(a1,a2):
print('f2函数体','F2')
return 'aa' 'bb'
print('返回值',f2('hu','lu'))
>>>before
>>>f2函数体 F2
>>>after
>>>返回值 aabb

python-day4-装饰器的使用的更多相关文章

  1. 小白的Python之路 day4 装饰器前奏

    装饰器前奏: 一.定义: 1.装饰器本质是函数,语法都是用def去定义的 (函数的目的:他需要完成特定的功能) 2.装饰器的功能:就是装饰其他函数(就是为其他函数添加附加功能) 二.原则: 1. 不能 ...

  2. 小白的Python之路 day4 装饰器高潮

    首先装饰器实现的条件: 高阶函数+嵌套函数 =>装饰器 1.首先,我们先定义一个高级函数,去装饰test1函数,得不到我们想要的操作方式 import time #定义高阶函数 def deco ...

  3. Python各式装饰器

    Python装饰器,分两部分,一是装饰器本身的定义,一是被装饰器对象的定义. 一.函数式装饰器:装饰器本身是一个函数. 1.装饰函数:被装饰对象是一个函数 [1]装饰器无参数: a.被装饰对象无参数: ...

  4. Python札记 -- 装饰器补充

    本随笔是对Python札记 -- 装饰器的一些补充. 使用装饰器的时候,被装饰函数的一些属性会丢失,比如如下代码: #!/usr/bin/env python def deco(func): def ...

  5. python基础——装饰器

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

  6. 【转】详解Python的装饰器

    原文链接:http://python.jobbole.com/86717/ Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现 ...

  7. 两个实用的Python的装饰器

    两个实用的Python的装饰器 超时函数 这个函数的作用在于可以给任意可能会hang住的函数添加超时功能,这个功能在编写外部API调用 .网络爬虫.数据库查询的时候特别有用 timeout装饰器的代码 ...

  8. python 基础——装饰器

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

  9. 理解Python中的装饰器//这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档

    转自:http://www.cnblogs.com/rollenholt/archive/2012/05/02/2479833.html 这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档 ...

  10. python基础—装饰器

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

随机推荐

  1. PHP重定向的三个方法

    js的重定向方法:location.href=目标 url(如 https:www.baidu.com); php的重定向方法: header("location: https:www.ba ...

  2. HDU 1114 Piggy-Bank 猪仔储钱罐(完全背包)

    题意: 给定一个存钱罐中要存硬币,知道空罐的重量和欲装满的重量,是否能装入?若能,打印最小价值.(注:能装的硬币重量一定刚刚好,里面的总价值要达到最小) 输入: 包含了T个测试例子,在第一行给出.接下 ...

  3. java常用框架总结

    一.SpringMVC http://blog.csdn.net/evankaka/article/details/45501811 Spring Web MVC是一种基于Java的实现了Web MV ...

  4. m3u8视频下载方法

    部分网站的视频内容,采用了m3u8的格式.正常打开网页可以,但是如果想下载到本地,就存在一定问题了.这里可以再获取到m3u8地址之后,利用vlc软件,来下载m3u8的视频. 工具:Firefox浏览器 ...

  5. POJ 2104 K-th Number(分桶,线段树,主席树)

    一道比较经典的数据结构题.可以用多种方式来做. 一,分桶法(平方分解). 根据数字x的大小和区间内不大于x的数字数量cnt的单调性,可知第k大数kth对应的cnt应该满足cnt≥k, 且kth是满足条 ...

  6. Linux下bash的快捷键

    Ctrl + A  :切换到命令行开始 Ctrl + E :切换到命令行末尾 Ctrl + L : 清屏,相当于clear Ctrl + U :清除剪切光标前的内容 Ctrl + K :剪切清除光标后 ...

  7. 2017.12.13 Java中是怎样通过类名,创建一个这个类的数组

    先在类方法中定义数组的方法: public int[] method6(int[] arr){ for(int i = 0; i<arr.length;i++){ arr[i] = (int)( ...

  8. 高级vim 配置

    [root@chenbj ~]# pwd /root [root@chenbj ~]# cat .vimrc set nocompatible set pastetoggle=<F9> s ...

  9. C# 创建和初始化集合对象

    一. 引言 C# 3.0中新的对象初始化器是一种简单的语法特征-借助于这种特征,对象的构建和初始化变得非常简单.假定你有一个类Student,它看起来有如下样子: public class Stude ...

  10. DOM4j-中文API

    1.DOM4J简介       DOM4J是 dom4j.org 出品的一个开源 XML 解析包.DOM4J应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM,SAX 和 JAXP. ...