Python学习之路——装饰器

开放封闭原则:不改变调用方式与源代码上增加功能

'''
1.不能修改被装饰对象(函数)的源代码(封闭)
2.不能更改被修饰对象(函数)的调用方式,且能达到增加功能的效果(开放)
'''
View Code

装饰器

# 把要被装饰的函数作为外层函数的参数通过闭包操作后返回一个替代版函数
# 被装饰的函数:fn
# 外层函数:outer(func)  outer(fn) => func = fn
# 替代版函数: return inner: 原功能+新功能def fn():print("原有功能")# 装饰器
def outer(tag):def inner():tag()print(新增功能")return inner
fn = outer(fn)              fn()

语法糖@外层函数

def outer(f):def inner():f()print("新增功能1")return innerdef wrap(f):def inner():f()print("新增功能2")return inner              @wrap  # 被装饰的顺序决定了新增功能的执行顺序
@outer  # <==> fn = outer(fn): inner      
def fn():print("原有功能")
View Code

有参有返的函数被装饰

def check_usr(fn):  # fn, login, inner:不同状态下的login,所以参数是统一的def inner(usr, pwd):# 在原功能上添加新功能if not (len(usr) >= 3 and usr.isalpha()):print('账号验证失败')return False# 原有功能result = fn(usr, pwd)# 在原功能下添加新功能# ...return resultreturn inner@check_usr
def login(usr, pwd):if usr == 'abc' and pwd =='123qwe':print('登录成功')return Trueprint('登录失败')return False# 总结:
# 1.login有参数,所以inner与fn都有相同参数
# 2.login有返回值,所以inner与fn都有返回值"""
inner(usr, pwd):res = fn(usr, pwd)  # 原login的返回值return reslogin = check_usr(login) = innerres = login('abc', '123qwe')  # inner的返回值
"""

装饰器最终写法

def wrap(fn):def inner(*args, **kwargs):print('前增功能')result = fn(*args, **kwargs)print('后增功能')return resultreturn inner@wrap
def fn1():print('fn1的原有功能')
@wrap
def fn2(a, b):print('fn2的原有功能')
@wrap   
def fn3():print('fn3的原有功能')return True
@wrap
def fn4(a, *, x):print('fn4的原有功能')return Truefn1()
fn2(10, 20)
fn3()
fn4(10, x=20)

 

转载于:https://www.cnblogs.com/king-home/p/10679729.html

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

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

相关文章

通断时间面积法

背景&#xff1a; 来 源&#xff1a; 通断时间面积法是入选《供热计量技术规程》JGJ173-2009的一种热量分摊计量方法实现分户计量的一种计量方法。由清华大学建筑节能研究中心江亿院士提出。 简 称 ( 俗称 )&#xff1a;&#xff08;1&#xff09;“时温法”&#xff08;2&a…

C++ std::move()和完美转发

std::move()、std::forward<T>、模板类型推断分析 引用折叠原则和完美转发是有联系的&#xff0c;可以说后者是基于前者的某些特性实现的&#xff0c;具体来看一下。 要理解完美转发&#xff0c;需要了解两个知识点&#xff1a; 引用折叠原则&#xff08;Reference colla…

线面要素类相互转换-原创

一、线转面的步骤 1、线几何属性转面几何属性ArcToolbox-Data Management Tools-Features-Feature To polygon&#xff0c;此过程只是将几何属性做了转换&#xff0c;得到的是属性信息丢失了的面t_L_HDBX_FeatureToPolygon1 2、 在ArcMap中将t_L_HDBX_FeatureToPolygon1全选&a…

SEO网站标题怎么优化

经过前两天发的两篇原创文章被加精之后&#xff0c;我的热情是一发不可收拾&#xff0c;忍不住又想写点干货给大家分享&#xff01;今天分析一下网站标题如何设置之SEO技巧。通过标题就可以看出&#xff0c;今天是讲网站标题如何设置&#xff0c;为什么要写这个呢&#xff1f;因…

Redis淘汰删除策略

Redis淘汰删除策略Redis淘汰删除策略6种淘汰Key策略3种删除过期键策略定时删除惰性删除定期删除其他模块的淘汰处理RDB 快照持久化创建载入AOF 只追加持久化写入重写主从复模式下对过期键的处理6种淘汰Key策略Redis中通过maxmemory参数来设定内存的使用上限&#xff0c;当Redis…

MySQL NDB Cluster

1. MySQL Cluster 是一种技术&#xff0c;该技术允许在无共享的系统中部署“内存中”数据库的 Cluster 。通过无共享体系结构&#xff0c;系统能够使用廉价的硬件&#xff0c;而且对软硬件无特殊要求。此外&#xff0c;由于每个组件有自己的内存和磁盘&#xff0c;不存在单点故…

《上邪》诗解

上邪&#xff01;①   我欲与君相知②&#xff0c; 长命③无绝衰。   山无陵④&#xff0c; 江水为竭&#xff0c;   冬雷震震⑤&#xff0c; 夏雨雪⑥ &#xff0c;   天地合⑦ &#xff0c; 乃敢⑧与君绝&#xff01;天啊&#xff01;我愿与你相爱&#xff0c;让我们…

win8 关于Adobe CS6系列软件Patch覆盖失败的问题(Photoshop CS6、Adobe Illustrator CS6、Adobe Fireworks CS6)...

我在Adobe文件夹下安装了Photoshop CS6和 Adobe Illustrator CS6&#xff0c;结果当我为AI覆盖Path文件后&#xff0c;我发现PS和AI全部都打不开了。反复覆盖还是没用。 不过很奇怪fireworks Cs6能用。FW我没有跟PS、AI装在同一个文件夹下。 我想难道是安装目录的问题&#xff…

获取Spring容器管理的Bean工具类

很多时候我们在一些不受spring管理的类中需要用到spring管理的Bean&#xff0c;那么这个时候可以使用如下工具类从spring容器中获取相关的Bean实例。 Component public class SpringApplicationContextUtils implements ApplicationContextAware {private static final Logger …

mysql - 内存表使用总结

部分转载&#xff1a;https://blog.csdn.net/hemeinvyiqiluoben/article/details/51222951?utm_mediumdistribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&dist_request_id&depth_1-utm_sourcedistribute.…

《集体智慧编程》——第一章导读

为什么80%的码农都做不了架构师&#xff1f;>>> 什么是集体智慧 其含义是指&#xff1a;为了长早新的想法&#xff0c;而将一群人的行为、偏好或思想组合在一起。 完成这项工作的一种最为基础的方法&#xff0c;便是使用调查问卷或普查。从一大群人中搜集的答案可…

使用spring的@autowired注解,无法实例化dao

首先理解spring的注解注入dao接口的目的是什么&#xff0c;是为了接口不用进行实例化就可以被任何一个类去调用 我昨天下午就是发现&#xff0c;不同的类&#xff0c;一模一样的注解&#xff0c;为什么前面的类可以使用注解调用mapper的sql查询&#xff0c;但是 第二个类死活无…

大括号之谜:C++的列表初始化语法解析

转载&#xff1a; https://segmentfault.com/a/1190000039362151 摘要&#xff1a;有朋友在使用std::array时发现一个奇怪的问题&#xff1a;当元素类型是复合类型时&#xff0c;编译通不过。 有朋友在使用std::array时发现一个奇怪的问题&#xff1a;当元素类型是复合类型时&a…

在Mono 2.8上部署ASP.NET MVC 2

Mono 2.8发布&#xff1a;C#4.0和更好的性能&#xff0c;我们知道Mono 2.8对ASP.NET MVC 2的完全支持&#xff0c;下面我们就来测试下在Mono 2.8上部署ASP.NET MVC 2应用程序。我的环境是Opensuse 11.3,通过以下命令部署好Mono 2.8的开发环境&#xff0c;之所以说是开发环境是同…

ASP.NET C# 数字格式化输出

int a 12345678; //格式为sring输出 Label1.Text string.Format("asdfadsf{0}adsfasdf",a); Label2.Text "asdfadsf"a.ToString()"adsfasdf"; Label1.Text string.Format("asdfadsf{0:C}adsfasdf",a);//asdfadsf&#xffe5;1,234…

gdb调试时,Program received signal SIGPIPE, Broken pipe.

今天在gdb调试时&#xff0c;发现总是出现Program received signal SIGPIPE, Broken pipe&#xff0c;搜索了网上的资料&#xff0c;发现是在调试时&#xff0c;接收到了SIGPIPE这个signal信号导致调试被中断。 By default, gdb captures SIGPIPE of a process and pauses it.…

看到一个暴强的翻译,闲的蛋疼,写个c#版的

在豆瓣上看到一篇关于拿破仑的翻译&#xff0c;文科生的翻译有几段相当传神&#xff0c;不得不佩服汉语的强大。有好事者还用程序语言实现了一下&#xff0c;现已有java、python和html的版本&#xff0c;我也来写个渺小的C#版本&#xff0c;运行结果和java版是一致的&#xff0…

太多的想法,反而不是什么好兆头

太多的想法&#xff0c;反而不是什么好兆头&#xff0c;思绪太多&#xff0c;反而影响专心做另外一件事情&#xff01;转载于:https://blog.51cto.com/newsnews/1113359

电销会员分销

AI(人工智能)机器人:真人语音智能流畅对话&#xff0c;支持打断&#xff0c;自动录音。自动按意向分A B C D 类。代替电销人员打电话&#xff0c;减少80%的重复劳动!低成本,高效率。 web部分&#xff0c;对接机器人&#xff0c;机器人智能语言交互。对一些做电销的企业来讲节省…

raft协议中统计一条log被多少节点复制

在raft协议中&#xff0c;client的请求都会转化为一条log&#xff0c;并且只能由leader才能处理来自client的请求&#xff0c;如果一个log请求到了follower上&#xff0c;最后也会重定向到leader上的。 好的&#xff0c;废话说多了&#xff0c;开始主题&#xff1a;raft协议中…