闭包函数与装饰器

一:闭包函数

     闭:指的是一个函数的一个内部函数

    包:指的是该函数包含对外部作用域的(而非全局作用域)名字的引用

    # def outter():
    #     x = 1
    #     def inner():
    #         print(x)
    #     return inner
    # f=outter()
    # def f2():
    #     x=1111111
    #     f()
    # f2()
    # def f3():
    #     x=4444444444444
    #     f()

    ·# f3()    

     作用域关系在函数的定义阶段已经固定死了,与调用位置无关。

     即在任意阶段调用函数都需要跑到定义函数的阶段去寻找作用域关系

     import requests
     def outter(url):
     # url='https://www.baidu.com'
     def get():
            response=requests.get(url)
            if response.status_code == 200:
            print(response.text)
    return get
    baidu=outter('https://www.baidu.com')
    python=outter('https://www.python.org')
    baidu()
    baidu()
    python()

    python()

二:装饰器,闭包函数的一种应用场景=》装饰器

   1、什么是装饰器
    器指的是工具,而程序中的函数就具备某一功能的工具
    装饰指的是为被装饰器对象添加额外功能
    就目前的知识来看:
        定义装饰器就是定义一个函数,只不过该函数的功能是用来为
        其他函数添加额外的功能
    其实:
        装饰器本身其实可以是任意可调用的对象
        被装饰的对象也可以是任意可调用的对象
    2、为什么要用装饰器
           软件的维护应该遵循开放封闭原则
           开放封闭原则指的是:
        软件一旦上线运行后对修改源代码是封闭的,对扩展功能的是开放的
        这就用到了装饰器
    装饰器的实现必须遵循两大原则:
        1、不修改被装饰对象的源代码
        2、不修改被装饰对象的调用方式
    装饰器其实就在遵循1和2原则的前提下为被装饰对象添加新功能

         3、如何用装饰器

            无参装饰器 

           #装饰器语法糖
           # 在被装饰对象正上方,并且是单独一行写上@装饰器名
           # import time
           # def timmer(func):
           #     #func=最原始的index
           #     def wrapper(*args,**kwargs):
           #         start=time.time()
           #         res=func(*args,**kwargs)
           #         stop=time.time()
           #         print('run time is %s' %(stop - start))
          #         return res
          #     return wrapper
          # @timmer # index=timmer(index)
          # def index():
          #     print('welcome to index')
          #     time.sleep(3)
          #     return 123
          # @timmer # home=timmer(home)
          # def home(name):
          #     print('welcome %s to home page' %name)
          #     time.sleep(2)
          # res=index()

          # home('egon')

          有参装饰器

          import time
          current_user={'user':None}
          def auth(engine='file'):
          def deco(func):
              def wrapper(*args,**kwargs):
                   if current_user['user']:
                   #已经登陆过
                        res = func(*args, **kwargs)
                        return res
                   user=input('username>>: ').strip()
                   pwd=input('password>>: ').strip()
                   if engine == 'file':
                    # 基于文件的认证
                           if user == 'egon' and pwd == '123':
                                  print('login successful')
                                   # 记录用户登陆状态
                                  current_user['user']=user
                                  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 deco
@auth(engine='mysql') # @deco #index=deco(index) #index=wrapper
def index():
    print('welcome to index page')
    time.sleep(1)
@auth(engine='mysql')
def home(name):
    print('welecome %s to home page' %name)
    time.sleep(0.5)
index()

home('egon')


          


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值