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

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

  一、装饰器

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

 

转载于:https://www.cnblogs.com/xiaocaiyang/p/9713829.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值