码迷,mamicode.com
首页 > 编程语言 > 详细

python-------装饰器

时间:2017-07-27 18:14:59      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:执行时间   扩展   nbsp   start   one   为什么   closed   pytho   isp   

一、简单的装饰器

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

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

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

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

技术分享
 1 import time 
 2 def  wrapper(func):
 3         def inner():
 4               start=time.time()
 5               func()
 6               end=time.time()
 7               print(end-start)
 8         return inner 
 9     
10 def  hahaha():
11         time.sleep(1)
12         print(‘aaaaa‘)
13 hahaha=wrapper(hahaha)
14 hahaha()    
简单的装饰器

技术分享

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

技术分享
 1 import time
 2 def wrapper(func):
 3         def inner():
 4                start=time.time()
 5                func()
 6                end=time.time()
 7                print(end-start)
 8         return inner
 9 @wrapper
10 def  kkk():#相当于kkk=wrapper(kkk)
11     print(‘aaaaa‘)
12 kkk()             
装饰器-------语法糖

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

技术分享
 1 import time
 2 def timmer(func):
 3     def inner(a):
 4         start=time.time()
 5         func(a)
 6         end=time.time()
 7         print(end-start)
 8     return inner
 9 
10 @timmer
11 def hahaha(a):
12     time.sleep(1)
13     print(a)
14 
15 
16 hahaha(5)   
带一个参数的装饰器
技术分享
 1 import time
 2 def timer(func):
 3     def inner(*args,**kwargs):
 4         start = time.time()
 5         re = func(*args,**kwargs)
 6         end=time.time()
 7         print(end- start)
 8         return re
 9     return inner
10 
11 @timer   #==> func1 = timer(func1)
12 def func1(a,b):
13     print(‘in func1‘)
14     print(a,b)
15 
16 @timer   #==> func1 = timer(func1)
17 def func2(a):
18     print(‘in func2 and get a:%s‘%(a))
19     return ‘fun2 over‘
20 
21 func1(1,2)
22 print(func2(‘aaaaaa‘))
原函数带多个参数的装饰器
技术分享
 1 import time
 2 def timer(func):
 3     def inner(*args,**kwargs):
 4         start = time.time()
 5         re = func(*args,**kwargs)
 6         end=time.time()
 7         print(end - start)
 8         return re
 9     return inner
10 
11 @timer   #==> func1 = timer(func1)
12 def jjj(a):
13     print(‘in jjj and get a:%s‘%(a))
14     return ‘fun2 over‘
15 
16 jjj(‘aaaaaa‘)
17 print(jjj(‘aaaaaa‘))
带返回值的装饰器

二、开放封闭原则

1.对扩展是开放的

2.对修改是封闭的

 三、装饰器的固定结构

 

技术分享
 1 import time
 2 def wrapper(func):  # 装饰器
 3     def inner(*args, **kwargs):
 4         ‘‘‘函数执行之前的内容扩展‘‘‘
 5         ret = func(*args, **kwargs)
 6          ‘‘‘函数执行之前的内容扩展‘‘‘
 7         return ret
 8     return inner
 9 
10 @wrapper  # =====>aaa=timmer(aaa)
11 def aaa():
12     time.sleep(1)
13     print(‘fdfgdg‘)
14 aaa()
View Code

 

python-------装饰器

标签:执行时间   扩展   nbsp   start   one   为什么   closed   pytho   isp   

原文地址:http://www.cnblogs.com/haiyan123/p/7246007.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!