闭包函数 装饰器 有参装饰器

闭包函数

1 内部函数

2 包含对外部作用域而非全局作用域的引用
闭包函数的特点:
      自带作用域
       延迟计算

 

 #闭包函数定义
1
def timmer(func): 2 def inner(*args,**kwargs): 3 re = func(*args,**kwargs) 4 return re 5 return inner 6 7 index(): 8 print("hello") 9 10 index = timmer(index) #index == inner 11 index() #index()==inner()

 

 

装饰器

 

一:开放封闭原则,对扩展是开放的,对修改是封闭的

 

二:装饰器,装饰器本质可以任意可调用对象,被装饰的对象也可以是任意
可调用对象,
装饰器的功能是:
在不修改被装饰对象源代码以及调用方式的前提下为期添加新功能

 

原则:
    1.不修改源代码
    2.不修改调用方法
    目标:添加新功能

 

 1 #装饰器的语法:在被装饰对象的正上方的单独一行,@装饰器名字
 2 import time
 3 import random
 4 #装饰器
 5 def timmer(func):
 6      def wrapper():
 7          start_time = time.time()  #添加的计算时间功能
 8          func()
 9          stop_time=time.time()
10          print('run time is %s' %(stop_time-start_time))
11      return wrapper
12 
13 #被装饰函数
14 @timmer      #index=timmer(index)  #index == wrapper
15 def index():  #index()== wrapper()
16      time.sleep(random.randrange(1,5))
17      print('welecome to index page')
18 
19 @timmer      #home=timmer(home)  #home==wrapper
20 def home():  
21      time.sleep(random.randrange(1,3))
22      print('welecome to HOME page')
23 
24 index() #wrapper()
25 home() #wrapper()

 

 

有参装饰器

 

 1 def deco(auth_type='file'):
 2     def auth(func):
 3         def wrapper(*args,**kwargs):
 4             if auth_type == 'file':
 5                 print('文件的认证方式')
 6             elif auth_type == 'ldap':
 7                 print('ldap认证方式')
 8             elif auth_type == 'mysql':
 9                 print('mysql认证方式')
10             else:
11                 print('不知到的认证方式')
12         return wrapper
13     return auth
14 
15 @deco(auth_type='abc') #@auth #index=auth(index)
16 def index():
17     print('welecome to index')
18 
19 @deco(auth_type='ldap')
20 def home(name):
21     print('welecome %s to home page' %name)
22 
23 index()
24 
25 home('egon')

 

posted @ 2017-07-30 22:16  123Luo  Views(130)  Comments(0)    收藏  举报