装饰器
#二 装饰器
"""
1、什么是装饰器
器指的是工具,可以定义成成函数
装饰指的是为其他事物添加额外的东西点缀
- 在不修改原函数的源代码以及调用方式的前提
- 代码冗余问题
- 没有修改被装饰对象的调用方式
- 参数写活了
- 被装饰对象写活了,原来只能装饰一个函数
- 将装饰器函数做的跟被装饰对象一模一样,以假乱真
- 偷梁换柱
-
在被装饰对象正上方的单独一行写@装饰器名字 装饰函数必须在被装饰函数上方
例如 @timmer # index=timmer(index) -
总结无参装饰器模板
def outter(func): def wrapper(*args,**kwargs): 1、调用原函数 2、为其增加新功能 res=func(*args,**kwargs) return res return wrapper
合到一起的解释:
装饰器指的定义一个函数,该函数是用来为其他函数添加额外的功能
2、为何要用装饰器
开放封闭原则
开放:指的是对拓展功能是开放的
封闭:指的是对修改源代码是封闭的
装饰器就是在不修改被装饰器对象源代码以及调用方式的前提下为被装饰对象添加新功能
3、如何用
"""
# 一:储备知识
#1、 *args, **kwargs # def index(x,y): # print(x,y) # # # def wrapper(*args,**kwargs): # index(*args,**kwargs) # # # index(y=222,x=111) # wrapper(y=222,x=111)
# 2、名称空间与作用域:名称空间的的"嵌套"关系是在函数定义阶段,即检测语法的时候确定的
# 3、函数对象:
# 可以把函数当做参数传入
# 可以把函数当做返回值返回
# def index(): # return 123 # # def foo(func): # return func # # foo(index)
# 4、函数的嵌套定义:
# def outter(func): # def wrapper(): # pass # return wrapper
# 闭包函数
# def outter(): # x=111 # def wrapper(): # x # return wrapper # # f=outter()
无参装饰器

图文字叙述

上面例题源码
# import time # def outter(func): # def wrapper(*args,**kwargs): # start=time.time() # res=func(*args,**kwargs) # stop=time.time() # print(stop-start) # return res # return wrapper #记住返回值不能加括号 # @outter #等同于 index=outter(index) 但是要记住装饰器是在被装饰函数上方 # def index(x,y,z): # time.sleep(3) # print("index{}{}{}".format(x,y,z)) # return 123 # # # index=outter(index)等同于@outter # res=index(1,2,3) # print(res)
直接传参
式例 index(x,y,z)
通过闭包传参
def outter(x): x=1 def wrapper(): print(1) print(2) print(3) x return wrapper # return outter内的wrapper那个函数的内地址 f1=outter(1) f2=outter(2) f3=outter(3) wrapper=outter(1)
认证功能 装饰器
举例1
def auth(func): def wrapper(*args,**kwargs): # 1、调用原函数 # 2、为其增加新功能 name=input('your name>>: ').strip() pwd=input('your password>>: ').strip() if name == 'egon' and pwd == '123': res=func(*args,**kwargs) return res else: print('账号密码错误') return wrapper
@auth
def index():
print('from index')
index()
工作后的再次理解
def warpper(func): #从上往下执行 :0 接到函数传递的函数:2 def index(*args,**kwargs): #被糖果导致向下执行:3 句柄被糖果装饰后被加()进行执行:6 res=func(*args,**kwargs) #拿取到加括号被调用的参数:7 print("经过了 装饰器") #函数执行完成向下继续执行:10 return res #返回被装饰函数返回的值:11 结束(到此@warpper被完成调用) return index #返回内层函数句柄:4 @warpper #执行到此处(糖果传递函数):1 (marry=warrper(marry)) #糖果装饰器获取返回值:8(获取return返回值,被赋值到第一步的marry) def marry(x,y): #正常函数钓用:9 print(x) print(y) marry(1,2) #此函数被用户填写调用:5(获取到内层函数:index,加括号并被执行)

浙公网安备 33010602011771号