函数装饰器

函数装饰器


无参装饰器:
1,开放封闭原则
对修改源代码是封闭的,对功能的扩展是开放的

总结:1,不修改源代码
2,不修改调用方式

目的:在遵循1和2原则的基础上扩展新功能

 


2,什么是装饰器:
在不修改被装饰对象源代码与调用方式的前提下,为被装饰器对象添加新功能

装饰器与被装饰的对象均可以是任意可调用的对象

装饰器---》函数
被装饰对象---》函数


模版:def outer(func):
                 def inner(*args,**kwargs):
                       res=func(*args,**kwargs)
                       return res
                 return inner


3,装饰器语法:用@接装饰器,在被装饰对象正上方另起一行

例:        import time
               def timmer(func):
                     def wrapper(*args,**kwargs):
                           start_time=time.time()        #起始时间
                           res=func(*args,**kwargs)
                           stop_time=time.time()
                           print(stop_time-start_time)        #结束时间
                           return res
                    return wrapper

@timmer            #index=timmer(index)
def index():
      time.sleep(1)
      print('welcome to index page')
      return 122

@timmer # home=timmer(home)
def home(name):
      time.sleep(2)           #延迟2秒
      print('welcome %s to home page' %name)

index()
home('egon')

当多个装饰器叠加使用时,使用顺序是从上到下



import time
current_user={
'username':None,
}

def auth(func):
      def wrapper(*args,**kwargs):
             if current_user['username']:
             print('已经登陆过了')
             res=func(*args,**kwargs)
            return res

           uname=input('用户名>>: ').strip()
           pwd=input('密码>>: ').strip()
           if uname == 'egon' and pwd == '123':
          print('登陆成功')
          current_user['username']=uname
            res=func(*args,**kwargs)
         return res
        else:
              print('用户名或密码错误')
     return wrapper

def timmer(func):
      def wrapper(*args,**kwargs):
            start_time=time.time()
            res=func(*args,**kwargs)
            stop_time=time.time()
            print(stop_time-start_time)
            return res
     return wrapper

@timmer # timmer 统计的是auth+index的执行时间
@auth
def index():
      time.sleep(1)
      print('welcome to index page')
     return 122

index()

posted @ 2018-03-31 09:20  鲁之敬  阅读(69)  评论(0编辑  收藏  举报