zoukankan      html  css  js  c++  java
  • 装饰器、装饰器的语法糖和有参装饰器~

      装饰器、装饰器的语法糖和有参装饰器~

      一、装饰器

        (1)什么是装饰器

          器=》工具

          装饰=》指的是为被装饰对象添加新功能

          装饰器本身可以是任意可调用的对象=》函数

          被装饰器的对象也可以是任意可调用的对象=》函数

          目标:写一个函数来为另外一个函数添加新功能

        (2)为何要用装饰器

          开放封闭原则:软件一旦上线就应该对修改封闭,对扩展开放

            对修改封闭:

              1、不能修改功能的源代码

              2、也不能修改功能的调用方式

            对扩展开放:

              可以为原有的功能添加新的功能

          装饰器就是要在不修改功能源代码以及调用方式的前提下为原功能添加额外新的功能

        (3)如何用装饰器

            import time

            def index():

              print('welcome to index page')

              time.sleep(3)

              return 123

            def home(name):

              print('welcome %s to home page'%name)

              time.sleep(1)

            def outter(func):

              def wrapper(*args,**kwargs):

                start = time.time()

                res = func(*args,**kwargs)

                stop = time.time()

                print('run time is %s'%(stop-start))

              return wrapper

            index = outter(index)

            home = outter(home)

            index()

            home('egon') 

      二、 装饰器的语法糖

          @装饰器的名字:要在被装饰对象正上方单独一行写上

          import time

          def timmer(func):

            def wrapper(*args,**kwargs):

              start = time.time()

              res = func(*args,**kwargs)

              stop = time.time()

              return res

            return wrapper

          @timmer  #装饰器语法糖

          def index():

            print('welcome to index page~')

            time.sleep(3)

            return 123

          @timmer #装饰器语法糖

          def home(name):

            print('welcome %s to home page~'%name)

          home('egon')

          index()

      三、有参装饰器

        模板:

          def ouuter2(xxx,yyy)

            def outter(func):

              def wrapper(*args,**kwargs)

                res = func(*args,**kwargs)

                print(xxx)

                print(yyy)

                return res

              return wrapper

            return outter

         

        案例:

          import time

          user_info={'current_user':None}

          def auth2(engine = 'file'):

            def auth(func):

              def wrapper(*args,**kwargs):

                if user_info['current_user'] is not None:

                  res = func(*args,**kwargs)

                  return res

                inp_user = input('username>>:').strip()

                inp_pwd = input('password>>:').strip()

                if engine == 'file':

                  print('基于文件的认证')

                  if inp_user == 'egon' and inp_pwd == '123':

                    user_info['current_user'] = inp_user

                    print('login successful~')

                    res = func(*args,**kwargs)

                    return res

                  else:

                    print('user or password error!~')

                elif engine == 'mysql':

                  print('基于mysql数据的认证')

                elif engine == 'ldap':

                  print('基于ldap数据的认证')

                else:

                  print('无法识别认证源')

              return wrapper

            return auth

          @auth2(engine = 'mysql')

          def index()

            '''这是index功能'''

            print('welcome to index page')

            time.sleep(2)

            return 123

          @auth2(engine = 'file')

          def home(name):

            '''这是home功能'''

            print('welcome %s to home page'%name)

            time.sleep(1)

          index()

          home('egon')

  • 相关阅读:
    PAT 1097. Deduplication on a Linked List (链表)
    PAT 1096. Consecutive Factors
    PAT 1095. Cars on Campus
    PAT 1094. The Largest Generation (层级遍历)
    PAT 1093. Count PAT's
    PAT 1092. To Buy or Not to Buy
    PAT 1091. Acute Stroke (bfs)
    CSS:word-wrap/overflow/transition
    node-webkit中的requirejs报错问题:path must be a string error in Require.js
    script加载之defer和async
  • 原文地址:https://www.cnblogs.com/xiaocaiyang/p/9713829.html
Copyright © 2011-2022 走看看