今日所得
闭包函数
装饰器
装饰器语法糖
装饰器模板
多层装饰器
闭包函数
所谓闭包函数就是函数套函数,内部的函数使用外层函数传递的参数
def num(x,y): x = input('') y = input('') def count(): if len(x) > len(y): return x return y return count
装饰器的简介
装饰器的封闭开放原则:封闭指的是被嵌套函数(被装饰的函数)的源码封闭
开放指的是对被装饰函数的功能可以扩展(不能对源码进行修改,只能在外部加函数对被装饰函数进行功能扩展)
装饰器就是一个工具,可以对被装饰函数进行装饰
装饰器必须遵循的两个原则:1.不能更改被装饰函数(可调用对象)的调用方式
2.不能改变被装饰函数的源码
语法糖
"""
语法糖就是@加上调用的函数名,执行过程是:
语法糖会把紧挨着它的下面的函数名当做参数来调用函数,
之后创建一个变量名来指向调用的这个函数
函数是从上往下依次执行的
语法糖是从下往上依次执行的
最后会用最开始的调用方式的函数名创建一个变量名指向最终调用的函数
"""
import time def outter(func): # func = 最原始的index函数的内存地址 def get_time(*args, **kwargs): start = time.time() res = func(*args, **kwargs) # 最原始的login函数的内存地址() 直接调用 func('egon') end = time.time() print('func run time:%s'%(end-start)) return res return get_time # login = outter(login) # outter(最原始的login函数的内存地址) # index = outter(index) # home = outter(home) @outter # index = outter(index) outter(最原始的index的函数的内存地址) def index(): time.sleep(3) print('澳门最大线上赌场开业啦 性感tank在线发牌!') return 'index'
装饰器模板
# 1.无参装饰器 from functools import wraps def outter(func): @wraps(func) def inner(*args,**kwargs): # * **在形参中使用 # 执行被装饰函数之前你可以做的操作 res = func(*args,**kwargs) # * **在实参中使用 # 执行被装饰函数之后你可以做到操作 return res return inner @outter def index(username,*args,**kwargs): """index注释""" pass print(index) # 装饰器修复技术 # 1.返回原来的函数的函数名 # 2.返回原来的函数的注释 # 2.有参装饰器(最复杂就三层) def wrappers(data): # data = 'file' def outter(func): def inner(*args,**kwargs): if data == 'file': # 执行被装饰函数之前你可以做的操作 res = func(*args,**kwargs) # * **在实参中使用 # 执行被装饰函数之后你可以做到操作 return res return inner return outter
多层装饰器,最重要的一句话就是:函数在定义阶段查找名字的顺序就已经固定了,是不是因为函数的调用位置改变而改变
装饰器修复技术
"""
这样在打印函数名地址和函数注解时就不会被发现函数已经被掉包
"""
from functools import wraps def outter(func): @wraps(func) # 装饰器修复技术 def inner(*args,**kwargs): pass