Python 装饰器
Posted 安柠筱洁
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于Python 装饰器的主要内容,如果未能解决你的问题,请参考以下文章