欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > python >内容正文

python

Python储备知识与装饰器

发布时间:2025/3/20 python 17 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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、函数对象:

  • 可以把函数当做参数传入
  • 可以把函数当做返回值返回
''' 遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书! ''' def func():print(x) x = 111def index():return 123def foo(func):return funcfoo(index)

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())

装饰器:装饰器指的定义一个函数,该函数是用来为其他函数添加额外的功能

开放封闭原则

  • 开放:指的是对拓展功能是开放的
  • 封闭:指的是对修改源代码是封闭的
# 需求:在不修改index函数的源代码以及调用方式的前提下为其添加统计运行时间的功能 def index(x,y):time.sleep(3)print('index %s %s' %(x,y))index(111,222)

解决方案一:失败

问题:没有修改被装饰对象的调用方式,但是修改了其源代码

''' 遇到问题没人解答?小编创建了一个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))start=time.time() index(111,222) stop=time.time() print(stop - start)start=time.time() index(111,222) stop=time.time() print(stop - start)

解决方案三:失败

问题:解决了方案二代码冗余问题,但带来一个新问题即函数的调用方式改变了

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储备知识与装饰器的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。