python学习之旅(装饰器)

简介: python学习之旅(装饰器)

前言

装饰器本质上是一个Python函数。


它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,


装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。


概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能


可以与闭包的概念联合起来理解


一个简单的装饰器

无参函数装饰

以一个获取函数执行时间的装饰器为例子

import time
def fnplus(fn):    # 将来会传入一个函数
    def f():
        print("我是一个装饰器,我现在开始装饰你的函数了......")
        time1 = time.time()
        fn()
        print("fun 用时 %.2f" % (time.time() - time1))
    return f      # 将函数本身返回


调用这个装饰器

直接调用(用的少)


先定义一个简单的原函数

def fun1():
    time.sleep(3)
    print("我是一个原函数")
fnplus(fun1)()

返回结果如下

"D:\PyCharm 2021.3.3\dtest\aliang-py\Scripts\python.exe" "D:/PyCharm 2021.3.3/aliang-py/装饰器.py"
我是一个装饰器,我现在开始装饰你的函数了......
我是一个原函数
fun 用时 3.01

通过语法糖调用(使用较多)


先定义

@fnplus
def fun1():
    time.sleep(3)
    print("我是一个原函数")

再调用

fun1()

返回结果

"D:\PyCharm 2021.3.3\dtest\aliang-py\Scripts\python.exe" "D:/PyCharm 2021.3.3/aliang-py/装饰器.py"
我是一个装饰器,我现在开始装饰你的函数了......
我是一个原函数
fun 用时 3.00


有参函数装饰

以一个获取函数执行时间的装饰器为例子

import time
def fnplus(fn):    # 将来会传入一个函数
    def f(msg):
        print("我是一个装饰器,我现在开始装饰你的函数了......")
        time1 = time.time()
        fn(msg)
        print("fun 用时 %.2f" % (time.time() - time1))
    return f      # 将函数本身返回

以语法糖的方式装饰有参函数

@fnplus
def fn1(a):
    time.sleep(2)
    print(f"我传入的参数是{a}")
fn1("hello world")

调用结果如下

"D:\PyCharm 2021.3.3\dtest\aliang-py\Scripts\python.exe" "D:/PyCharm 2021.3.3/aliang-py/装饰器.py"
我是一个装饰器,我现在开始装饰你的函数了......
我传入的参数是hello world
fun 用时 2.01


目录
相关文章
|
1月前
|
存储 Java 数据处理
(numpy)Python做数据处理必备框架!(一):认识numpy;从概念层面开始学习ndarray数组:形状、数组转置、数值范围、矩阵...
Numpy是什么? numpy是Python中科学计算的基础包。 它是一个Python库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种方法,包括数学、逻辑、形状操作、排序、选择、I/0 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。 Numpy能做什么? numpy的部分功能如下: ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 线性代数、随机数生成以及傅里叶变换功能。 用于集成由C、C++
292 0
|
1月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
162 1
|
1月前
|
算法 Java Docker
(Python基础)新时代语言!一起学习Python吧!(三):IF条件判断和match匹配;Python中的循环:for...in、while循环;循环操作关键字;Python函数使用方法
IF 条件判断 使用if语句,对条件进行判断 true则执行代码块缩进语句 false则不执行代码块缩进语句,如果有else 或 elif 则进入相应的规则中执行
249 1
|
1月前
|
测试技术 Python
Python装饰器:为你的代码施展“魔法”
Python装饰器:为你的代码施展“魔法”
234 100
|
2月前
|
设计模式 缓存 监控
Python装饰器:优雅增强函数功能
Python装饰器:优雅增强函数功能
267 101
|
1月前
|
缓存 Python
Python装饰器:为你的代码施展“魔法
Python装饰器:为你的代码施展“魔法
152 88
|
2月前
|
缓存 测试技术 Python
Python装饰器:优雅地增强函数功能
Python装饰器:优雅地增强函数功能
206 99
|
2月前
|
存储 缓存 测试技术
Python装饰器:优雅地增强函数功能
Python装饰器:优雅地增强函数功能
185 98
|
2月前
|
缓存 Python
Python中的装饰器:优雅地增强函数功能
Python中的装饰器:优雅地增强函数功能
|
2月前
|
存储 缓存 测试技术
理解Python装饰器:简化代码的强大工具
理解Python装饰器:简化代码的强大工具

推荐镜像

更多