装饰器详解

装饰器

1. 需求

需求:在func函数执行前输出before,执行后输出after。

def func():print("我是func函数")value = [11,22,33,44]return valueresult = func()
print(result)

1.1 闭包实现

# ********闭包实现********
def func():print("我是func函数")value = [11, 22, 33, 44]return valuedef outer(origin):def inner():print("before")res = origin()  # 调用原来的func函数print("after")return resreturn innerfunc = outer(func)  # 接收到innerresult = func()   # 调用inner()
print(result)

输出:

before
我是func函数
after
[11, 22, 33, 44]

1.2 python特殊语法(装饰器)

"""
python 中支持特殊语法,在某个函数上方使用:@函数名
def xxx():passpython 内部会自动执行 函数名(xxx), 执行完之后,再将结果赋值给 xxx.
xxx = 函数名(xxx)
"""

闭包进阶实现:

# ********闭包进阶********
def outer(origin):def inner():print("before")res = origin()  # 调用原来的func函数print("after")return resreturn inner@outer   # 内部执行func = outer(func)
def func():print("我是func函数")value = [11, 22, 33, 44]return valueresult = func()
print(result)

2. 新需求

# 需求:在下面三个函数执行前后分别输出before和afterdef func1():print("我是func1函数")value = [11, 22, 33, 44]return valuedef func2():print("我是func2函数")value = [11, 22, 33, 44]return valuedef func3():print("我是func3函数")value = [11, 22, 33, 44]return valuefunc1()
func2()
func3()

2.1 特殊语法实现

# ***********装饰器实现****************
def outer(origin):def inner():print("before")res = origin()  # 调用原来的func函数print("after")return resreturn inner@outer
def func1():print("我是func1函数")value = [11, 22, 33, 44]return value@outer
def func2():print("我是func2函数")value = [11, 22, 33, 44]return value@outer
def func3():print("我是func3函数")value = [11, 22, 33, 44]return valuefunc1()
func2()
func3()

输出:

before
我是func1函数
after
before
我是func2函数
after
before
我是func3函数
after

2.2 函数有参数

# ***********函数有参数****************
def outer(origin):def inner(*args, **kwargs):print("before")res = origin(*args, **kwargs)  # 调用原来的func函数print("after")return resreturn inner@outer
def func1(a1):print("我是func1函数")value = [11, 22, 33, 44]return value@outer
def func2(a1, a2):print("我是func2函数")value = [11, 22, 33, 44]return value@outer
def func3(a1):print("我是func3函数")value = [11, 22, 33, 44]return valuefunc1(1)
func2(11, 22)
func3(666)

3. 装饰器

3.1 装饰器

以上的特殊语法被称为**装饰器**:

  • 实现原理:基于@语法和函数闭包实现,将原函数封装在闭包中,然后将函数赋值为一个新的函数(内层函数),执行函数时再在内层函数中执行闭包中的原函数;

  • 实现效果:可以在不改变原函数内部代码 和 调用方式的前提下,给函数添加新功能;

  • 使用场景:多个函数系统统一在 执行前后自定义一些功能。

  • 装饰器示例:

    def outer(origin):def inner(*args, **kwargs):# 执行前res = origin(*args, **kwargs)  # 调用原来的func函数# 执行后return resreturn inner@outer
    def func(a1):passfunc()
    

3.2 扩展1:flask应用场景

from flask import Flaskapp = Flask(__name__)def auth(func):def inner(*args, **kwargs):# 判断用户是否已经登录,已登录继续往下走,未登录则返回登录页面res = func(*args, **kwargs)  # 执行原函数return resreturn inner@auth
def index():return '首页'@auth
def info():return '用户中心!'@auth
def order():return '订单中心!'def login():return '登录页面!'app.add_url_rule('/index', view_func=index)
app.add_url_rule('/info', view_func=index)
app.add_url_rule('/order', view_func=index)
app.add_url_rule('/login', view_func=index)app.run()

3.3 扩展2:functools

import  functools
def auth(func):@functools.wraps(func)def inner(*args, **kwargs):"""I am inner"""res = func(*args, **kwargs)  # 执行原函数return resreturn inner@auth
def admin():"""这是admin函数"""pass@auth
def index():"""这是index函数"""pass# # 未使用装饰器
# print(admin.__name__)   # admin
# print(admin.__doc__)    # 这是admin函数
# print(index.__name__)   # index
# print(index.__doc__)    # 这是index函数# # 使用装饰器
# print(admin.__name__)   # inner
# print(admin.__doc__)    # I am inner
# print(index.__name__)   # inner
# print(index.__doc__)    # I am inner# 内部函数inner使用functools后
print(admin.__name__)   # admin
print(admin.__doc__)    # 这是admin函数
print(index.__name__)   # index
print(index.__doc__)    # 这是index函数

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

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

相关文章

tf.sequence_mask

用法: sequence_mask(lengths,maxlenNone,dtypetf.bool,nameNone ) 函数参数 lengths:整数张量,其所有值小于等于maxlen。maxlen:标量整数张量,返回张量的最后维度的大小;默认值是lengths中的最大值。dt…

国产首款脑机编解码集成芯片发布

来源:科学网5月17日,由中电云脑(天津)科技有限公司(简称“中电云脑”)联合天津大学共同研发的国产首款脑机编解码集成芯片——“脑语者”在天津第三届世界智能大会上正式发布。这是一款拥有完全自主知识产权…

软件工程的认识

软件工程是一门研究用工程法构建和维护有效的、实用的和高品质的软件的学科。它涉及程序设计语言、数据库、软件开发工具、系统平台、标准、设计模式方面。在现代社会中,软件应用于多个方面。典型的软件有电子邮件、嵌入式系统、人机界面、办公套件、操作系统、编译…

tf.while_loop

用法: final_state tf.while_loop(cond, loop_body, init_state) cond 是一个函数,负责判断继续执行循环的条件。loop_body 是每个循环体内执行的操作,负责对循环状态迸行更新。init_state 为循环的起始状态,它可以包含多个 T…

mysql 8.0.25 取巧解决修改密码报错问题

mysql修改密码 报错 # 修改密码 set password for rootlocalhostpassword(新密码);1.1 报错: ERROR 1064 (42000): You have an error in your SQL syntax;check the manual that corresponds to your MySQL server version for the right syntax to use near pas…

资金只够支撑10个月,自动驾驶致命事故重演:特斯拉陷入困境

来源:机器学习研究会订阅号特斯拉在上海的工厂正在快速建设过程中,然而最近马斯克的一封致员工信引发了人们对于这家车企的担忧。另一方面,同日曝光的 Model 3 自动驾驶致命事故又为新技术的前途蒙上了阴影。据路透社、Electrek 等媒体报道&a…

把WinRAR默认压缩格式换为ZIP

使用WinRAR的一个技巧,说实话,我并不喜欢WinRAR,不过不可否认这个软件有其方便的地方,在一些细节方面7Zip的确不如WinRAR做的好。 例如,WinRAR默认建立的压缩包都是RAR格式的,但我们希望默认都使用ZIP格式的…

颠覆性技术的兴起及其影响

来源:学习时报1990年代美国学者克里斯滕森提出“颠覆性技术”之后,这一“时髦”的概念经常出现在商业、军事等不同的学科和领域,对国家竞争力、经济、安全、国家关系等方面产生了深远影响。许多国家和地区都充分意识到了这一问题的重要性&…

tf.concat()

tf.concat(values,axis, nameconcat ) 作用: 在axis维度上对输入矩阵进行拼接 例子: import tensorflow as tfa tf.constant([[1, 2, 3], [4, 5, 6]]) b tf.constant([[7, 8, 9], [10, 11, 12]]) c tf.concat([a, b], axis0) d tf.concat([a, b]…

Windows Redis安装

Windows Redis安装 在 Windows 系统下安装 Redis 要比 Linux 系统安装稍微复杂一些。 下载地址:点击前往 解压文件,目录如下: 2.1 启动服务端程序 如上图所示,双击 Redis 服务端启动程序 redis-server.exe,看到以下…

Android Studio如何快速生成get,set,tostring,构造函数

刚开始使用Android Studio时,在创建一个javabean时,很习惯的在JavaBean类中,右键去找生成get,set等选项。但是很遗憾,找不到。 那这边如何快速的set,get或者生成构造函数,生成toString方法。 有…

python面试-2

python中的数据类类型 Python3 中有六个标准的数据类型: Number(数字)String(字符串)List(列表)Tuple(元组)Set(集合)Dictionary(字…

科幻变成现实?超导加速未来新科技

来源:未来产业促进会演绎inSite 第十二期节目超导:改变未来世界罗会仟,中国科学院物理研究所副研究员、科普作家、中国科学院青年创新促进会数理分会会长。获首届全国青年科学博客大赛 “最佳科学博客奖”、中国科普作家协会优秀科普作品金奖…

[转载]用UglifyJS2合并压缩混淆JS代码——javascript系列

从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发。Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎。chrome浏览器就基于V8,同时打开20-30个网页都很流畅。Nodejs标准的web开发框架…

tf.logging.set_verbosity (tf.logging.INFO)

tf.logging.set_verbosity (tf.logging.INFO) 作用&#xff1a;将 TensorFlow 日志信息输出到屏幕 TensorFlow有五个不同级别的日志信息。其严重性为调试DEBUG<信息INFO<警告WARN<错误ERROR<致命FATAL。当你配置日志记录在任何级别&#xff0c;TensorFlow将输出…

为什么说无人出租车关乎特斯拉和Uber的生死存亡

来源 网易智能在英特尔高级副总裁兼Mobileye首席执行官阿姆农沙舒亚&#xff08;Amnon Shashua&#xff09;看来&#xff0c;对于特斯拉、Uber和Lyft来说&#xff0c;无人驾驶出租车市场之争关乎生死存亡。如果你必须要听一个打车公司的高管说说随着无人驾驶出租车的兴起&#…

iOS-本地推送和远程推送,常用的三方推送和常用的测试方法,推送实现和原理详解...

什么是消息推送 举一个常见的例子&#xff0c;我们的手机上经常会有弹出一些信息&#xff0c;例如QQ信息、微信信息等等&#xff0c;这就是常见的消息推送。 例如&#xff1a; 消息推送的类型&#xff1a; 在屏幕顶部显示一块横幅&#xff08;显示具体内容&#xff09;在屏幕中…

enumerate() 函数

enumerate(sequence, [start0]) 作用&#xff1a; 将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列&#xff0c;同时列出数据和数据下标&#xff0c;一般用在 for 循环当中。 参数&#xff1a; sequence -- 一个序列、迭代器或其他支持迭代对象。start --…

3 : 1,从21世纪科技趋势分析美国为什么一定要遏制华为

作者&#xff1a;刘锋 计算机博士 互联网进化论作者前言&#xff1a;某种意义&#xff0c;21世纪国家间科技竞争的焦点就在于对互联网这个”类脑巨系统”的控制和利用。互联网有四个重要的战略核心&#xff0c;1.通讯系统--互联网神经纤维 2.芯片--智能设备心脏 3&#xff0…

命令式和声明式

命令式编程&#xff1a;命令“机器”如何去做事情(how)&#xff0c;这样不管你想要的是什么(what)&#xff0c;它都会按照你的命令实现。 声明式编程&#xff1a;告诉“机器”你想要的是什么(what)&#xff0c;让机器想出如何去做(how)。 转载于:https://www.cnblogs.com/sprin…