装饰器分类

Posted on 2019-01-15 15:55  杜卡迪S11  阅读(172)  评论(0编辑  收藏  举报

一、什么是装饰器

装饰器就是用一个函数去扩展另一个已存在的函数的功能(扩展性对于一个应用程序来说是非常重要的能力,任何应用程序都需要扩展,于是出现了开闭原则)

开闭原则:对修改关闭,对扩展开放

不允许修改源代码以及调用方式

装饰器就是一种保证不修改源代码,也不修改调用方式,还能给函数添加新功能的方式

二、无参装饰器(完整版)

import time

def download():

  print('download run!')

def outer(func):

  def run_time(*args,**kwargs):

    boot_time = time.time()

    res = func(*args,**kwargs):

      boot_time=time.time()

      res=func(*args,**kwargs)

      print("耗时:",time.time()-boot_time)

      return res

  return run_time()

download=outer(download)

 

三、装饰的语法糖(提供输出日记(日志)功能)

import time

def logger(func):

  def wrapper(*args,**kwargs):

    print("时间:%s func:%s"  % (time.time(),func._name_))

    res = func(*args,**kwargs)

    return  res

  return wrapper

@logger

def login():

  print("登陆成功。。")

login()

 

三、同时叠加多个装饰器

impot time 

def logger(func):

  def wrapper(*args,**kwargs):    

    print("时间:%s  func:%s" % (time.time(),func._name_))

    res= func(*args,**kwargs)

    return res

  return wrapper

@logger

def login():

  print("登陆成功。。。")

login()

 

四、装饰器在购物车中的应用

is_login  = False

def auth(func):

  def wrapper(*args,**kwargs):

    if is_login:

      func(*args,**kwargs)

    else:

      print("还没有登录请先登录。。。")

      login()

  return wrapper   

def login():

  global  is_login

  name=input('name:').strip()

  pwd=input('pwd:')。strip()

  if name=='alan' and pwd == '123':

    print('登陆成功!!')

    is_login=True

@auth

def shopping():

  print("请登录。。。")

@auth

def collection():

  print()

def main():

  while True:

    func={"1":login,"2":shopping,"3":collection}

    print("""

               1、登录

    2、购物车

    3、收藏夹

    """)

    res = input(">>>:"),strip()

    if res in funcs:

      funcs[res]()

    else:

      print("输入错误")

main()

 

五、有参装饰器

需求:提供一个输出日志的装饰器,可以指定日志的输出位置,打印到控制台或者文件中

import time 

def outer(location)

  def logger(func):

    def wrapper(*args,**kwargs):

      if location=="cmd":

        print("时间:%s func:%s" %(time.time().func_name_))

      elif location="file":

        with open("a.log","a",encoding="utf-8")as f:

          f.write("时间:%s func:%s" % (time.time(),func_name_))

      else:

        print("位置不对,,,,,,必须是file或者是cmd")

      return func(*args,**kwargs)

    return wrapper

  return logger

@outer("files")

def test():

  print("test run")

test()