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

  • 相关阅读:
    zz学习技术的三部曲:WHAT、HOW、WHY
    zz一种理想的在关系数据库中存储树型结构数据的方法
    某外企SQL Server面試題
    C语言中的指针 &与*
    剖析SQL Server执行计划(zz)
    UNICODE,GBK,UTF8区别
    (Part 1Chapter 14) High Performance Linux Clusters with OSCAR, Rocks, OpenMosix, and MPI
    关于GtkTreeView和 MVC的一篇好文章 入木三分
    一个混合 MPI_Init() 和 gtk_init() 的实例序
    (Part 2Chapter 57) High Performance Linux Clusters with OSCAR, Rocks, OpenMosix, and MPI
  • 原文地址:https://www.cnblogs.com/xiaocaiyang/p/9713829.html
Copyright © 2011-2022 走看看