Python with 工作原理、装饰器、回收机制、内存管理机制、拷贝、作用域等( 九 )


这里的deco函数就是最原始的装饰器 , 它的参数是一个函数 , 然后返回值也是一个函数 。其中作为参数的这个函数func()就在返回函数()的内部执行 。
在函数func()前面加上@deco , func()函数就相当于被注入了计时功能 , 现在只要调用func() , 它就已经变身为“新的功能更多”的函数了 。
这里装饰器就像一个注入符号:有了它 , 拓展了原来函数的功能既不需要侵入函数内更改代码 , 也不需要重复执行原函数 。
#带有不定参数的装饰器import timedef deco(func):def wrapper(*args, **kwargs):startTime = time.time()func(*args, **kwargs)endTime = time.time()msecs = (endTime - startTime)*1000print("time is %d ms" %msecs)return wrapper@decodef func(a,b):print("hello , here is a func for add :")time.sleep(1)print("result is %d" %(a+b))@decodef func2(a,b,c):print("hello , here is a func for add :")time.sleep(1)print("result is %d" %(a+b+c))if __name__ == '__main__':f = funcfunc2(3,4,5)f(3,4)#func()
多个装饰器执行的顺序就是从最后一个装饰器开始 , 执行到第一个装饰器 , 再执行函数本身 。
装饰器是先从被调函数开始看 , 如果被装饰 , 就执行装饰函数直到遇到包裹函数 , 如果包裹函数也被装饰 , 就再执行上层装饰函数 , 循环下去 , 直到没有上层装饰器 , 然后再从最上层装饰执行下去 。
@deco01@deco02def func(a,b):print("hello , here is a func for add :")time.sleep(1)print("result is %d" %(a+b))
我的测试案例展示如下所示:
import timefrom functools import wrapsdef outter(long=1):def deco(func):@wraps(func)def wrapper(*args, **kwargs):print(args, kwargs)start = time.time()res = func(*args, **kwargs)time.sleep(long)# delay timeend = time.time()# wrapper.__name__ = func.__name__# wrapper.__doc__ = func.__doc__print("the cost of time is :{}".format(end - start))return resreturn wrapper# wrapper‘s addressreturn deco@outter(2)def old_func(name, key="bilibili"):"""the infor of helloworld"""print("helloworld", name, key)return "helloworld"old_func("唤醒手腕")print(old_func.__name__)print(old_func("唤醒手腕"))# func = deco(func)
09、垃圾回收机制
对于来说 , 一切皆为对象 , 所有的变量赋值都遵循着对象引用机制 。程序在运行的时候 , 需要在内存中开辟出一块空间 , 用于存放运行时产生的临时变量;计算完成后 , 再将结果输出到永久性存储器中 。如果数据量过大 , 内存空间管理不善就很容易出现 OOM(out of ) , 俗称爆内存 , 程序可能被操作系统中止 。
而对于服务器 , 内存管理则显得更为重要 , 不然很容易引发内存泄漏 - 这里的泄漏 , 并不是说你的内存出现了信息安全问题 , 被恶意程序利用了 , 而是指程序本身没有设计好 , 导致程序未能释放已不再使用的内存 。
内存泄漏也不是指你的内存在物理上消失了 , 而是意味着代码在分配了某段内存后 , 因为设计错误 ,  失去了对这段内存的控制 , 从而造成了内存的浪费 。也就是这块内存脱离了gc的控制 。
的垃圾回收机制:计数引用、循环回收、标记清除、分代回收
垃圾回收机制:计数引用
因为中一切皆为对象 , 你所看到的一切变量 , 本质上都是对象的一个指针 。