闭包函数装饰器
Posted dcentman
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了闭包函数装饰器相关的知识,希望对你有一定的参考价值。
一、补充知识点
1、可调用的callable(可以加括号执行某个特定功能):函数名,类名
2、import this:查看Python之禅
二、闭包函数
1、定义
闭:定义在函数内部的函数
包:内部函数引用了外部函数作用域的名字
2、形式
def outter(x,y): def inner(): 代码1 代码2 return inner res = outter(1, 2) res()
3、作用
给函数体传参有两种方式,第一种是直接给函数体传参,第二种就是用闭包函数,它是利用外部函数给内部函数传参,这样在调用内部函数的时候,就可以不写参数。
4、举例
import requests # requests是python实现的简单易用的HTTP库 def outter(url): def my_get(): response = requests.get(url) if response.status.code == 200: print(len(response.text)) return my_get my_jd = outter("https://www.jd.com") my_jd()
三、装饰器
1、定义
器:就是一个工具
装饰:给被装饰对象添加新的功能
2、开放封闭原则
开放:对扩展开放
封闭:对修改封闭
3、装饰器必须遵守的两个原则
①、不改变被装饰对象源代码
②、不改变被装饰对象(可调用对象)调用方式
4、装饰器简单版
""" 统计index函数执行的时间 """ import time # 导入时间模块 def index(): time.sleep(1) #让程序暂停1秒,测量程序运行时间时,如果时间过短,测量时间会是0,加上延时后就可以测量 print(‘澳门最大线上赌场开业啦 性感tank在线发牌!‘) def outter(func): # func = 最原始的index函数的内存地址 def get_time(): start = time.time() func() # func = index函数的内存地址() 直接调用 end = time.time() print(‘index run time:%s‘%(end-start)) return get_time index = outter(index) # outter(最原始的index函数内存地址) # index指向get_time函数的内存地址 index()
5、装饰器升级版
解决了函数参数的问题,无参函数和有参函数都可以直接调用,可以接收任意数量的参数
import time def index(): time.sleep(1) print(‘from index‘) return index res = index() # from index def login(name): time.sleep(1) print(name) return login res1 = login(‘egon‘) # egon def outter(func): def get_time(*args, **kwargs): # 可以传入任意参数,放入元组和字典中 start = time.time() res = func(*args, **kwargs) # 将元组和字典打散,将参数原封不动的传给func函数 end = time.time() print(end-start) return res return get_time index = outter(index) login = outter(login) index() # from index # 1.0002615451812744 # 此时的index()已经多了计时功能 login(‘egon‘) # egon # 1.0002918243408203 # 此时的login()已经多了计时功能 print(res) # <function index at 0x00DFA660> print(res1) # <function login at 0x028435D0> print(index) # <function outter.<locals>.get_time at 0x028436F0> print(login) # <function outter.<locals>.get_time at 0x02843660>
6、装饰器语法糖
以上是关于闭包函数装饰器的主要内容,如果未能解决你的问题,请参考以下文章