python之装饰器

在讨论装饰器之前,先看几个概念:

一、函数嵌套

    函数的嵌套调用:在调用一个函数的过程中,又调用了其它函数。

    函数的嵌套定义:在一个函数的内部,又定义另外一个函数

二、名称空间

    名称空间:存放名字的地方,准确的说名称空间是存放名字与变量绑定关系的地方

    内置名称空间:在python解释器启动时产生,存放一些python内置的名字

    全局名称空间:在执行文件时产生,存放文件级别定义的名字  

    局部名称空间:在执行文件的过程中,如果调用了函数,则会产生该函数的局部名称空间,用来存放该函数内第一的名字,该名字在函数调用时生效,在函数调用结束后失效

    加载顺序:内置===》全局===》局部

    名字的查找顺序是:局部===》全局===》内置

三、作用域

    全局作用域:全局存活,全局有效

    局部作用域:临时存活,局部有效

    作用域关系:在函数定义时就已经固定,于调用位置无关

    在调用函数时,变量在执行之前定义或修改,打印函数执行之前定义或修改的变量:在调用函数时候,变量在执行之后定义或修改,打印函数定义之前的变量,没有在函数定义执行之前定义变量就报错。

    局部名称:locals()

    全局名称:globals()

四、闭包函数

    1、定义在函数内部的函数

    2、包含对外部作用域名字的引用,而不是对全局作用域名字的引用,那么该内部函数就成为闭包函数

五、装饰器

    1、装饰器之开放封闭原则:对修改封闭,对扩展开放

    2、什么是装饰器

      装饰他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象

      装饰器的原则:(1)、不修改被装饰对象的源代码  (2)、不修改被装饰对象的调用方式

      装饰器的目的:在遵循装饰器原则的前提下,为装饰对象添加上新功能

    3、装饰器的语法

      被装饰对象的正上方,单独一行

           @deco3
  def foo():
pass
  foo=deco1(deco2(deco3(foo)))
    4、装饰器里的注释信息:
        from functools import wraps
        def timmer(func):
        @wraps(func)
        def wrapper(*args,**kwargs):
        stat=time.time()
        res=func(*args,**kwargs)
        stop=time.time()
        print('run time is %s' %(stop-stat))
         return res
         return wrapper
        def index(username):
        '''这是index函数'''
        time.sleep(3)
        print('welcome to index %s' %username)
        return 123
    5、函数可以被多次装饰:
      def timmer(func):
        @wraps(func)
          def wrapper(*args,**kwargs):
      stat=time.time()
      res=func(*args,**kwargs)
      stop=time.time()
      print('run time is %s' %(stop-stat))
      return res
       return wrapper
        
      dic_s={'user':None}
      def timer1(func):
       def wapper(*args,**kwargs):
       username=input('you name:').strip()
       password=input('you password:').strip()
       if dic_s['user']==username:
      print('1')
    return func(*args,**kwargs)
      with open('db.txt','r',encoding='utf-8') as f:
       user_dic=eval(f.read())
       if username in user_dic and password==user_dic[username]:
     res=func(username)
     dic_s['user']=username
     return res
     else:
   print('user or password error')
      return wapper

      @timmer
      @timer1
      def index(username):
      '''这是index函数'''
      time.sleep(3)
      print('welcome to index %s' %username)
      return 123
posted @ 2017-07-25 04:52  咬耗子的猫  阅读(105)  评论(0)    收藏  举报