Day5 python装饰器

一、python装饰器基本概念

  定义:本质是函数,用来装饰其他函数,即为其他函数添加附加功能。

  原则:1.不能修改被装饰函数的源代码;

       2.不能修改被装饰函数的调用方式。

  实现装饰器的知识储备:

    1.函数即“变量”。

    2.高阶函数

      a.把一个 函数名 当作实参传给另一个函数;

      b.返回值中包含 函数名 

    3.嵌套函数

      即在用def定义一个函数的函数体中再用def定义函数。

  高阶函数 + 嵌套函数 => 装饰器

二、函数即“变量”

  定义一个变量

1 x = 1

  变量名x相当于一个门牌号,而1就是这个门牌号所指房间中的内容。

  定义一个函数

1 def foo():
2     print(‘in the foo‘)

  函数名foo就相当于一个门牌号,而函数体 print(‘in the foo‘) 作为一串字符串存在这个门牌号所指的房间中。

  故 函数即“变量”

三、高阶函数

  a. 把一个函数名当作实参传递给另一个函数(在不修改被装饰函数源代码的情况下为其添加功能);

  b. 返回值中包含函数名(不改变函数的调用方式)。

  代码示例:

 1 #a:把一个 函数名 当作实参传给另一个函数 (在不修改被装饰函数源代码的情况下为其添加功能)
 2 import time
 3
 4 def bar():
 5     time.sleep(3)
 6     print(‘in the bar‘)
 7
 8 def test1(func):
 9     print(func)
10     start_time = time.time()
11     func()     #运行bar()
12     stop_time = time.time()
13     print("the func run time is %s"%(stop_time-start_time))
14
15 test1(bar)  # bar即为函数的内存地址,加“()”即为调用此函数
16 #bar()

<function bar at 0x0000021F3E956048>
in the bar
the func run time is 3.0008294582366943

Result

 1 #b:返回值中包含 函数名 (不改变函数的调用方式)
 2 import time
 3
 4 def bar():
 5     time.sleep(3)
 6     print(‘in the bar‘)
 7
 8 def test2(func):
 9     print(func)
10     return func
11
12 t = test2(bar)
13 print(t)
14 bar = test2(bar)   # 注意这一句
15 bar()
16 t()   #run bar

<function bar at 0x00000265D5486048>
<function bar at 0x00000265D5486048>
<function bar at 0x00000265D5486048>
in the bar
in the bar

Result

四、嵌套函数

  在用def定义一个函数的函数体中再用def定义函数。

  代码示例:

1 def foo():
2     print("in the foo")
3     def bar():
4         print("in the bar")
5     bar()
6 #bar()       #错误写法 ,函数即变量,可把bar看作局部变量
7 foo()

in the foo
in the bar

Result

五、装饰器

  1. 引例,为test1()增加输出运行时间的功能。

 1 import time
 2
 3 def timer(func):   #timmer(test1)    func=test1
 4     def deco():
 5         start_time = time.time()
 6         func()     #在def中,func()只是一串字符串,func()并没有调用执行
 7         stop_time = time.time()
 8         print("the func run time is %s" % (stop_time - start_time))
 9     return deco
10
11 def test1():
12     time.sleep(3)
13     print("in the test1")
14
15 test1 = timer(test1)  #注意这一句
16 test1()    #运行test()即为运行deco()

in the test1
the func run time is 3.0002777576446533

Result

  2.无参数装饰器

import time

def timer(func):   #timmer(test1)    func=test1
    def deco():
        start_time = time.time()
        func()     #在def中,func()只是一串字符串,func()并没有调用执行
        stop_time = time.time()
        print("the func run time is %s" % (stop_time - start_time))
    return deco

@timer   # test1=timer(test1)
def test1():
    time.sleep(3)
    print("in the test1")

test1()

in the test1
the func run time is 3.0149574279785156

Result

  引入 @timer ,即相当于 test1=timer(test1) 语句。

  3.带不确定个数个参数的装饰器

 1 import time
 2
 3 def timer(func):   #timmer(test1)    func=test1
 4     def deco(*args,**kwargs):
 5         start_time = time.time()
 6         func(*args,**kwargs)     #在def中,func()只是一串字符串,func()并没有调用执行
 7         stop_time = time.time()
 8         print("the func run time is %s" % (stop_time - start_time))
 9     return deco
10
11 @timer   # test1=timer(test1)
12 def test1():
13     time.sleep(3)
14     print("in the test1")
15
16 @timer
17 def test2(name):
18     time.sleep(1)
19     print("in the test2",name)
20
21 test1()
22 test2(‘ztian‘)

in the test1
the func run time is 3.000495195388794
in the test2 ztian
the func run time is 1.000511884689331

Result

  利用*args和**kwargs实现不定参数个数的装饰器。

原文地址:https://www.cnblogs.com/zhangwb204/p/8414310.html

时间: 2024-10-02 18:54:23

Day5 python装饰器的相关文章

5.初识python装饰器 高阶函数+闭包+函数嵌套=装饰器

一.什么是装饰器? 实际上装饰器就是个函数,这个函数可以为其他函数提供附加的功能. 装饰器在给其他函数添加功能时,不会修改原函数的源代码,不会修改原函数的调用方式. 高阶函数+函数嵌套+闭包 = 装饰器 1.1什么是高阶函数? 1.1.1函数接收的参数,包涵一个函数名. 1.1.2 函数的返回值是一个函数名. 其实这两个条件都很好满足,下面就是一个高阶函数的例子. def test1(): print "hamasaki ayumi" def test2(func): return t

python装饰器通俗易懂的解释!

python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说明一下: 小P闲来无事,随便翻看自己以前写的一些函数,忽然对一个最最最基础的函数起了兴趣: 1 def sum1(): 2 sum = 1 + 2 3 print(sum) 4 sum1() 此时小P想看看这个函数执行用了多长时间,所以写了几句代码插进去了: 1 import time 2 3 def

python装饰器1

第八步:让装饰器带 类 参数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 # -*- coding:gbk -*- '''示例8: 装饰器带类参数''' class locker:     def __init__(self):         print("locker.__init__() should be not called.")   

Python装饰器由浅入深

装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们以装饰函数为例子介绍其用法.要理解在Python中装饰器的原理,需要一步一步来.本文尽量描述得浅显易懂,从最基础的内容讲起. (注:以下使用Python3.5.1环境) 一.Python的函数相关基础 第一,必须强调的是python是从上往下顺序执行的,而且碰到函数的定义代码块是不会立即执行它的,只

python 装饰器学习(decorator)

最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initial decorator" f() def __call__(self): print "call decorator" @decorator def fun(): print "in the fun" print "after " fun

【转】九步学习python装饰器

本篇日志来自:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 纯转,只字未改.只是为了学习一下装饰器.其实现在也是没有太看明白,对于装饰器我就是用的时候找例子,能蒙对,但是用过之后一段时间就忘了.还是用的少.有空应该好好看一看的,包括闭包.对于各种现代编程语言来说闭包都是很重要的.在这里先谢过原作者,如有侵权请告知. =-=-=-=-=-=-=-=-=-=-一条不怎么华丽的分隔线-=-=-=-=-=-=-=-=-=-= 这

【Python之旅】第四篇(一):Python装饰器

有时候拿到一个程序接口,需要对其进行扩展,但是又不能修改原来接口的源代码,这时候就需要使用装饰器了. 有下面一个小程序,假如是别人提供给我们的调用接口: import time def sayHi():         time.sleep(1)         print 'Hello, I am xpleaf.' 一般情况下,如果想要计算该程序的执行时间(因为有可能要对该接口进行某些性能上的测试),就需要把以上接口修改为下面这样,同时执行一下: 程序代码: import time def s

python装饰器原理及相关操作

python装饰器,简单的说就是用于操作底层代码的代码,在不改变底层代码函数的情况下对底层代码进行验证操作等 首先,必须知,道调用func和func的区别,分别为返回函数所在的内存地址和调用该函数,输出执行结果,例如: def func(): print("欢迎光临!!!") print("返回函数所在的内存地址:",func) func() 列举一个简单的web页面调用例子 1 #做登录验证 2 def login(func): 3 print("登录成

python装饰器学习笔记

什么是python装饰器? 装饰器其实也就是一个函数,一个用来包装函数的函数,返回一个修改之后的函数对象,将其重新赋值原来的标识符,并永久丧失对原始函数对象的访问. eg:当需要在Func1和Func2中加一样的功能时,可以在outer中添加一次就可以完成全部函数的添加.装饰器与函数建立连接的方式是在函数的前一行用@+装饰器名称来完成.并且在装饰器中一定要返回被装饰的对象 def outer(fun):     def wrapper():         print '验证'