一。 装饰器:
1 什么是装饰器 器=>工具 装饰=>指的是为被装饰对象添加新功能 装饰器本身可以是任意可调用的对象=>函数 被装饰的对象也可以是任意可调用的对象=>函数 目标:写一个函数来为另外一个函数添加新功能 2 为何要用装饰器 开放封闭原则: 软件一旦上线就应该对修改封闭,对扩展开放 对修改封闭: 1. 不能修改功能的源代码 2. 也不能修改功能的调用方式 对扩展开发: 可以为原有的功能添加新的功能 装饰器就是要在不修改功能源代码以及调用方式的前提下为原功能添加额外新的功能3 如何用装饰器 ‘‘‘import time def index(): print(‘welcome to index page‘) time.sleep(3) def outter(func): # func=最原始那个index的内存地址 def wrapper(): start=time.time() func() # 最原始那个index的内存地址() stop=time.time() print(‘run time is %s‘ %(stop-start)) return wrapper index=outter(index) #index=outter(最原始那个index的内地址) #index=wrapper函数的内地址index() #wraper() 二。装饰器的修正:
import time def index(): print(‘welcome to index page‘) time.sleep(3) return 123 #==============================================================def outter(func): # func=最原始那个index的内存地址 def wrapper(): start=time.time() res=func() # 最原始那个index的内存地址() stop=time.time() print(‘run time is %s‘ %(stop-start)) return res return wrapper index=outter(index) #index=outter(最原始那个index的内地址) #index=wrapper函数的内地址#============================================================== res=index() #res=wraper()print(res) 三。装饰器的修正2:
import time def index(): print(‘welcome to index page‘) time.sleep(3) return 123 def home(name): print(‘welcome %s to home page‘ %name) time.sleep(1) #==============================================================def outter(func): # func=最原始那个home的内地址 def wrapper(*args,**kwargs): start=time.time() res=func(*args,**kwargs) stop=time.time() print(‘run time is %s‘ %(stop-start)) return res return wrapper index=outter(index) #index=outter(最原始那个index的内地址) #index=wrapper函数的内地址home=outter(home) #index=outter(最原始那个home的内地址) #home=wrapper函数的内地址#============================================================== home(‘egon‘) #wrapper(‘egon‘)index() #wrapper() 四。装饰器的语法糖:装饰器的名字,要在被装饰对象的正上方单独一行写上。
from functools import wraps import timedef timmer(func): # func=最原始那个home的内地址 @wraps(func) def wrapper(*args,**kwargs): start=time.time() res=func(*args,**kwargs) stop=time.time() print(‘run time is %s‘ %(stop-start)) return res return wrapper @timmerdef index(): """这是index功能""" print(‘welcome to index page‘) time.sleep(3) return 123 @timmerdef home(name): """这是home功能""" print(‘welcome %s to home page‘ %name) time.sleep(1) print(help(index))print(index.__name__) (经过处理。index.跟老的lindex的名字,注释。都完全相同)
五。有参数装饰器在函数内部需要一个参数,但是自己的参数不能改变的时候,就要在外面再包一层函数来传给需要参数的函数。 六。global与nonlocal:
x=1def func(): x=2 func()print(x) x=[]def func(): x.append(1) x.append(2) x.append(3) func()print(x) global: 在局部声明变量是全局变量x=1def func(): global x x=2 func()print(x) nonlocal:在局部声明变量是外层函数的变量
x=333def f1(): x=222 def f2(): x=111 def f3(): nonlocal x x=0 f3() print(‘f2内部的x: ‘,x) f2() print(‘这是f1内部的x: ‘,x) f1()print(x)
原文地址:https://www.cnblogs.com/lvyipin1/p/9715533.html
时间: 2024-10-03 04:46:52