python装饰器

举报
泽宇-Li 发表于 2021/09/08 09:43:39 2021/09/08
【摘要】 作为第二大语言的python 如何用装饰器??

编辑之前在知乎上看到了一个很形象的比喻来描述装饰器  它是这么说的:

内裤可以用来掩盖  但是到了冬天没办法御寒  聪明的人发明可长裤有了长裤后就不会冷了  装饰器就是这里说的长裤  在不影响内裤作用的前提下给我们的身体提供了保暖的功效

来认识下装饰器吧??什么是装饰器?

装饰器本身是一个python函数  可以在不改动其他函数的前提下对函数得到功能进行扩充通常情况下装饰器用于下列情况中:

1)引入日志

2)函数执行时间的统计

3)执行函数前预备处理

4)执行函数后清理功能
5)权限校验

6)缓存

例:

def  test_one():

print('test_one')

def test_one():

  print('test_one')

  print('test_one  is running')

test_one()

但是如果函数test_two() 函数 test_three()都有类似的需求  那么现在这样的做法会出现大量重复的代码 为了减少重复的代码我们就要设置一个新的函数专门记录函数执行日志谁需要记录执行日志就把谁作为参数传递   实例如下:

def print_log(func):

      print("函数正在运行中")

     func()

def  test():

      print('test')

print_log(test)

按照上述代码将函数作为参数传递虽然可以实现功能但是破坏了原有代码的逻辑结构如果要求已经实现的函数不能修改只能扩展即遵循  封闭开放的原则!那么是不允许在函数test内部进行修改的

装饰器可以满足上述要求  在python中以@开头下面  我们写一个简单的装饰器

def  wrap(func):

   print('正在装饰')

   def inner():

    print('正在验证权限')     

     func()

return   inner

@wrap   

def test():

   print('test')

test()

下面我们分析以下程序的执行过程

1)当程序执行test()时 发现函数 test()上面有装饰器@warp 所以会先执行@warp@warp等价于test=warp(test)可以拆分俩步:

1  执行wrap(test)  将函数名 test作为参数传递给wrap 在调用wrap函数的过程中首先会执行print语句   输出正在装饰 然后会将形参func指向test()函数体并将inner()函数的引用返回给wrap(test)作为wrap(test)的返回值

2 将wrap(test)的返回值赋给test  此时  test指向inner()函数

到此我们完成了test()的装饰

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。