闭包和装饰器
-
闭包
闭包指延申了作用域的函数, 也就是作用域中的
Enclosed
的概念def make_averager(): series = [] def averager(value): series.append(value) total = sum(series) return total / len(series) return averager # my_avg就是延申了作用域的函数 # series就是被延申作用域的变量 my_avg = make_averager() print(my_avg(1)) print(my_avg(2))
-
装饰器
-
实现原理
就是闭包, 延申了被装饰函数的作用域, 本质是将函数作为参数传递给一个可调用对象(函数或类)
-
目的
增加和扩展可调用对象(函数或类)的行为
-
实现一个装饰器
-
通过
@
关键字装饰函数def clock_it_deco(func): def wrapper(*args, **kwargs): start_time = time.time() result = func(*args, **kwargs) end_time = time.time() print(f"{func.__name__} execute time: {format(end_time - start_time, '.2f')} s") return result return wrapper # @other_deco 可以叠加 如果有多个装饰器,顺序是从下往上 @clock_it_deco def foo(a, b): count = 1 while True: if count > a ** b: break count += 1 foo(10, 5)
-
等同于
foo = clock_it_deco(foo) foo(10, 5)
-
-