• Python 装饰器


    一、作用域

    Python 的作用域分四种情况:

    L:local,局部作用域,即函数中定义的变量;

    E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的;

    G:globa,全局变量,就是模块级别定义的变量;

    B:built-in,系统固定模块里面的变量,比如int, bytearray等。

    搜索变量的优先级顺序依次是:作用域局部>外层作用域>当前模块中的全局>python内置作用域

    实例:

    def out():
    name = 'Ami'
    def inner():
    name = 'Amily'
    print(name)
    inner()
    print(name)

    out()
    #内嵌函数作用域由内而外查找
    输出结果:

     

    可以看到内嵌函数可以访问外部函数定义的作用域中的变量,事实上内嵌函数解析名称时首先检查局部作用域,

    然后从最内层调用函数的作用域开始,搜索所有调用函数的作用域,它们包含非局部但也非全局的命名。

    二、装饰器

    装饰器的本质还是一个函数,在不改变函数调用方式的情况下,对函数进行额外功能的封装

    装饰一个函数,给它加一个其他功能

    功能:1.引入日志;2.函数执行时间统计;3.执行函数前预备处理;4.执行函数后清理功能;5.权限校验;6.缓存

    常见实例:给函数加上时间

    import time
    import random

    def cal_time(func):#定义一个计时器,传入一个函数,并返回另一个附加了计时功能的方法
    def wrapper(*args, **kwargs):#定义一个内嵌的包装函数,给传入的函数加上计时功能的包装
    t1 = time.time()
    result = func(*args, **kwargs)
    t2 = time.time()
    print("%s running time: %s secs." % (func.__name__, t2 - t1))
    return result
    return wrapper # 将包装后的函数返回

    @cal_time #@cal_time == cal_time(bin_search)
    def bin_search(data_set, val):
    low = 0
    high = len(data_set) - 1
    while low <= high:
    mid = (low+high)//2
    if data_set[mid] == val:
    return mid
    elif data_set[mid] < val:
    low = mid + 1
    else:
    high = mid - 1
    return
    函数调用:
    data = list(range(100000000))
    print(bin_search(data, 173320))
    创建一个装饰器将下面函数输入的字符串首字母大写
    from functools import wraps
    def start_word_upper(func):
    @wraps(func)
    def inner(*args,**kwargs):
    word = func(*args,**kwargs)
    return word.capitalize()
    return inner

    @start_word_upper
    def greetins(word='hi there'):
    return word.lower()

    result = greetins('hello python')
    print(result)
    输出结果:Hello python

  • 相关阅读:
    macOS 常用配置
    maven 常用配置
    log4j(1.x)最全配置!!!
    Python2 中 input() 和 raw_input() 的区别
    用 Maven 构建 Java-Scala 混合项目
    trim() 的秘密
    【目录】一起来学 Kafka 吧
    Spring in Action.4th
    Hibernate快速入门
    html2canvas 跨域图片无法正常加载问题解决办法
  • 原文地址:https://www.cnblogs.com/chendai21/p/8863624.html
Copyright © 2020-2023  润新知