Python储备知识与装饰器
生活随笔
收集整理的这篇文章主要介绍了
Python储备知识与装饰器
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
储备知识:
1、 *args, **kwargs
def index(x,y):print(x,y)def wrapper(*args,**kwargs):index(*args,**kwargs) #wrapper(222,111)2、名称空间与作用域:名称空间的的"嵌套"关系是在函数定义阶段,即会检测语法的错误
def func():print(x)x = 111func()3、函数对象:
- 可以把函数当做参数传入
- 可以把函数当做返回值返回
4、函数的嵌套定义:
def outter(func):def wrapper():passreturn wrapper闭包函数
def outter():x = 0def wrapper():nonlocal xx += 1return xreturn wrapperwrapper = outter() print(wrapper())传参的方式一:通过参数的形式为函数体传值
''' 遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书! ''' def wrapper(x):print(1)print(2)print(3)xwrapper(1) wrapper(2) wrapper(3传参的方式二:通过闭包的方式为函数体传值
def outter(x):def wrapper():print(1)print(2)print(3)xreturn wrapperwrapper=outter(1) print(wrapper())装饰器:装饰器指的定义一个函数,该函数是用来为其他函数添加额外的功能
开放封闭原则
- 开放:指的是对拓展功能是开放的
- 封闭:指的是对修改源代码是封闭的
解决方案一:失败
问题:没有修改被装饰对象的调用方式,但是修改了其源代码
''' 遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书! ''' import timedef index(x,y):start=time.time()time.sleep(3)print('index %s %s' %(x,y))stop = time.time()print(stop - start)index(111,222)解决方案二:失败
问题:没有修改被装饰对象的调用方式,也没有修改了其源代码,并且加上了新功能
但是代码冗余
解决方案三:失败
问题:解决了方案二代码冗余问题,但带来一个新问题即函数的调用方式改变了
import timedef index(x,y):time.sleep(3)print('index %s %s' %(x,y))def wrapper():start=time.time()index(111,222)stop=time.time()print(stop - start)wrapper()方案三的优化一:将index的参数写活了
''' 遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书! ''' import timedef index(x,y,z):time.sleep(3)print('index %s %s %s' %(x,y,z))def wrapper(*args,**kwargs):start=time.time()index(*args,**kwargs) stop=time.time()print(stop - start)wrapper(3333,4444,5555)方案三的优化二:在优化一的基础上把被装饰对象写活了,原来只能装饰index
import timedef index(x,y,z):time.sleep(3)print('index %s %s %s' %(x,y,z))def home(name):time.sleep(2)print('welcome %s to home page' %name)def outter(func):def wrapper(*args,**kwargs):start=time.time()func(*args,**kwargs) stop=time.time()print(stop - start)return wrapperindex=outter(index) home=outter(home)方案三的优化三:将wrapper做的跟被装饰对象一模一样,以假乱真
''' 遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书! ''' import timedef index(x,y,z):time.sleep(3)print('index %s %s %s' %(x,y,z))def home(name):time.sleep(2)print('welcome %s to home page' %name)def outter(func):def wrapper(*args,**kwargs):start=time.time()res=func(*args,**kwargs)stop=time.time()print(stop - start)return resreturn wrapperhome=outter(home)语法糖:在被装饰对象正上方的单独一行写@装饰器名字
import time # 装饰器 def timmer(func):def wrapper(*args,**kwargs):start=time.time()res=func(*args,**kwargs)stop=time.time()print(stop - start)return resreturn wrapper@timmer def index(x,y,z):time.sleep(3)print('index %s %s %s' %(x,y,z))@timmer def home(name):time.sleep(2)print('welcome %s to home page' %name)index(x=1,y=2,z=3) home('egon')总结无参装饰器模板
def outter(func):def wrapper(*args,**kwargs):# 1、调用原函数# 2、为其增加新功能res=func(*args,**kwargs)return resreturn wrapper总结
以上是生活随笔为你收集整理的Python储备知识与装饰器的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: python教程:有参装饰器
- 下一篇: Python文件操作中进行字符串替换(保