zoukankan      html  css  js  c++  java
  • 装饰器分类

    一、什么是装饰器

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

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

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

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

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

    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()

     

      

  • 相关阅读:
    pycharm中文乱码
    bootstrap-table分页
    sql将查询结果的某个字段赋值给另一个字段
    bootstrap tab选项卡
    cocos-js 精灵移动转圈
    配置环境变量路径有空格
    配置java环境遇到的问题及解决方案
    obj = obj || {} 分析这个代码的起到的作用
    sql server行转列
    sql server统计总成绩和排名
  • 原文地址:https://www.cnblogs.com/zhangzhechun/p/10272422.html
Copyright © 2011-2022 走看看