装饰器的作用和功能
答:装饰器最大的作用就是对于我们已经写好的程序,我们可以抽离出一些雷同的代码组建多个特定功能的装饰器,这样我们就可以针对不同的需求去使用特定的装饰器,这时因为源码去除了大量泛化的内容而使得源码具有更加清晰的逻辑:1)引入日志 2)函数执行时间统计 3)执行函数前预备处理 4) 执行函数后的清理功能 5)权限校验等场景 6)缓存 import time
def decorator(func):
def wrapper(*args, **kwargs):
start_time = time.time()
func()
end_time = time.time()
print(end_time - start_time)
return wrapper
@decorator
def func():
time.sleep(0.8)
func() # 函数调用
关联:闭包的理解
概念:说法1:在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用,那么内部函数就被认为是闭包(closure);说法2:闭包=函数块+定义函数时的环境。说法3:闭包函数相对普通函数多了__closure__属性。该属性返回由cell对象组成的元组,每个cell对象就是引用的外部变量的地址。
使用闭包注意事项:1,闭包中是不能修改外部作用域的局部变量的。如果要修改,可在内部函数首先通过nolocal定义引用的外部变量。2.闭包中的变量是在内部函数被调用的时候去找的。 def outer(a):
b =10
def inner(): # 闭包函数
print(a+b) # 引用外部变量b
return inner # 返回内部函数名
out = outer(3) # 惰性,此时a+b的值还未生成
out() # 系统去寻找内存中a,b的值并返回a+b
关联:什么是猴子补丁?
答:概念:属性在运行时的动态替换,叫做猴子补丁(Monkey Patch)。
class A():
def func(self):
print("Hi")
def func2(self):
print("Hi,monkey")
A.func = A.func2 #替换funcA().func()使用目的:1、追加功能;2、功能变更;3、修正程序错误;4、增加钩子,在执行某个方法的同时执行一些其他的处理,如打印日志,实现AOP等;5、缓存,在计算量很大,结算之后的结果可以反复使用的情况下,在一次计算完成之后,对方法进行替换可以提高处理速度。
关联:猴子补丁与装饰器的区别
答:猴子补丁作用于运行时,装饰器作用于定义时。