python函数-装饰器

python函数-装饰器

1.装饰器的原则--开放封闭原则

 开放:对于添加新功能是开放的

封闭:对于修改原功能是封闭的

2.装饰器的作用

在不更改原函数调用方式的前提下对原函数添加新功能

3.装饰器的本质--闭包

4.装饰器

  (1)简单的装饰器

def deco(f):def wrapper():"""原函数前添加的功能"""f()"""原函数后添加的功能"""return wrapperdef func():print('这是原函数!')func = deco(func)
func()

  (2)装饰器的语法糖-----@deco

def deco(f):def wrapper():"""原函数前添加的功能"""f()"""原函数后添加的功能"""return wrapper@deco # ——>此处效果等同于 func = deco(func)
def func():print('这是原函数')func()

  (3)带返回值的装饰器

def deco(f):def wrapper():"""原函数前添加的功能"""res = f()"""原函数后添加的功能"""return resreturn wrapper@deco
def func():print('这是原函数')
func()

  (4)装饰器加参数的固定格式

def deco(f):def wrapper(*args,**kwargs):"""原函数前添加的功能"""res = f(*args,**kwargs)"""原函数后添加的功能"""return resreturn wrapper@deco
def func(*args,**kwargs):print('这是原函数')
func()

  (5)装饰器的固定格式--wraps版

from functools import wrapsdef wrapper(func):@wraps(func)def inner(*args,**kwargs):print('在被装饰的函数执行之前做的事')ret = func(*args,**kwargs)print('在被装饰的函数执行之后做的事')return retreturn inner
@wrapper
def holiday(day):print("新年快乐")return '好开心'
print(holiday.__name__)
print(holiday.__doc__)
ret = holiday(3)
print(ret)>>>>
holiday
None
在被装饰的函数执行之前做的事
新年快乐
在被装饰的函数执行之后做的事
好开心

  

(6) 多个装饰器装饰一个函数 

def wrapper1(func):def inner1():print('wrapper1 ,before func')func()print('wrapper1 ,after func')return inner1def wrapper2(func):def inner2():print('wrapper2 ,before func')func()print('wrapper2 ,after func')return inner2@wrapper2 # 将inner1进行装饰,即inner1 = wrapper2(inner1) = inner2
@wrapper1 # 先执行这个装饰器,即f = wrapper1(f) = inner1
def f():print('in f')f()>>>>
wrapper2 ,before func
wrapper1 ,before func
in f
wrapper1 ,after func
wrapper2 ,after func

  

  

转载于:https://www.cnblogs.com/a438842265/p/8467705.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/414667.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Math常用方法,String转float并且保留两位小数,除法

除法 public static double div(double v1, double v2, int scale) {if (scale < 0) {throw new IllegalArgumentException("The scale must be a positive integer or zero");}BigDecimal b1 new BigDecimal(Double.toString(v1));BigDecimal b2 new BigDecim…

博弈总结

SG函数部分内容大多借(chao)鉴(xi)自zyf学长 也有一些自己独到的理解 Hackenbush和纳什均衡直接弃掉了 不平等博弈有空再看 题目还有很多没切完 不过确实是没时间了&#xff0c;毕竟博弈只是一小块内容。 经典博弈 博弈论入门之巴什博奕 博弈论入门之nim游戏 博弈论入门之威佐夫…

Android 设置手机屏幕亮度

1、工具类 /*** 作者&#xff1a;created by meixi* 邮箱&#xff1a;15913707499163.com* 日期&#xff1a;2019/3/20 10*/public class BrightnessTools {/*** 判断是否开启了自动亮度调节*/public static boolean isAutoBrightness(ContentResolver aContentResolver) {boo…

bzoj 4300

这题让我很容易想起了求最长上升子序列&#xff0c;但是直接朴素算法 O( n ^ 2 ) 会超时。 考虑数在 int 范围内&#xff0c;那只需要保存二进制下某位为 1 的数为结尾的最大长度即可。 #include"cstdio" #include"cctype" #include"algorithm" …

Hibernate 补充 ManyToOne、OneToMany、OneToOne的使用例

1、前言 Hibernate 为程序员提供一种级联操作&#xff0c;在编写程序时&#xff0c;通过 Hibernate 的级联功能可以很方便的操作数据库的主从表的数据&#xff0c;我们最常用的级联是级联保存和级联删除。2、ManyToOne | OneToMany 单词误导 当我们去试用的时候&#xff0c;首先…

移动端使用页尾文字使用绝对定位遇到input框会飘起来的处理方案

如下版权信息的样式在遇到input框的时候会跟随输入框其后 优雅的解决方式&#xff1a;&#xff08;定位遇上键盘飘窗解决&#xff09; mounted里面写上&#xff1a;var originalHeightdocument.documentElement.clientHeight || document.body.clientHeight; //console.info(&…

代码中特殊的注释技术——TODO、FIXME和XXX的用处(转)

1、声明 本篇转自博客&#xff1a;http://blog.csdn.net/reille/ 2、转载内容 2.1、前言 今天在阅读 Qt Creator 的源代码时&#xff0c;发现一些注释中有 FIXME 英文单词&#xff0c;用英文词典居然查不到其意义&#xff01;实际上&#xff0c;在阅读一些开源代码时&#xff0…

Android 解决导入多个module时jar包冲突

1、在后导入的module中编译先前导入的module compile project(path: :faceplatform) 2、删除后导入的module里面的和先前导入的module的重复jar包&#xff0c; 同理jniLibs里面重复的so文件也需要删除 在线回复bug:qq1085220040

linux 添加环境变量(php为例)

find / -name php vim /etc/profile 文件最后添加 export PATH$PATH:/usr/local/php/bin source /etc/profile php -v 这时只实现了当前ssh 登录时可以PHP&#xff0c;如果退出重新登录就不能使用PHP了 解决&#xff1a; vim ~/.bashrc 添加 source /etc/profile source ~/.…

@ConfigurationProperties + @EnableConfigurationProperties

1、ConfigurationProperties 在类上通过ConfigurationProperties注解声明当前类为属性读取类。 举例&#xff1a; ConfigurationProperties(prefix "jdbc") prefix"jdbc" 读取属性文件中&#xff0c;前缀为jdbc的值。 在类上定义各个属性&#xff0c;名称…

Android 活体人脸实时采集,百度、虹软

百度现在功能较少——使用虹软&#xff0c;方便 虹软官网&#xff1a;https://ai.arcsoft.com.cn/ucenter/resource/build/index.html 申请应用&#xff0c;下载SDK即可 虹软已修改好的&#xff0c;可注册人脸&#xff0c;人脸验证成功——登陆的demo&#xff1a;https://down…

Android 最新左右可见上下页的banner实现demo

运行效果&#xff0c;可见上下页样式 demo链接&#xff1a;https://download.csdn.net/download/meixi_android/11045703 实现方法 首先添加必要依赖 implementation (com.android.support:recyclerview-v7:27.0.2){force true } implementation (com.android.support:cardv…

WIN10下微信崩溃(已经是最新版)的解决方法

问题症状&#xff1a;WIN10下运行最新版微信&#xff08;CrashVersion1644560715&#xff09; ---------------------------微信运行错误---------------------------你的微信崩溃次数较多&#xff0c;建议使用最新版本&#xff0c;点击"确定"到官网(http://pc.weixi…

o.s.b.d.LoggingFailureAnalysisReporter

1、错误信息 *************************** APPLICATION FAILED TO START ***************************Description:Field userMapper in club.sscai.userservice.user.service.UserService required a bean of type club.sscai.userservice.user.mapper.UserMapper that could …