IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python装饰器 -> 正文阅读

[Python知识库]python装饰器

1. 装饰器

  1. 什么是装饰器:

    它本质就是一个闭包函数,不改变已有函数的代码 对函数添加额外功能

  2. 注意:

    1. 已有函数的源代码 和 调用方式 不改动
    2. 对已有函数增加其它功能
  3. 开放封闭原则

    开放封闭原则,也适用于函数式编程
    封闭:对于已经完成的代码块,不修改源代码
    开放:对扩展开放,有其它需求是可以 添加

2. 我的第一个装饰器

# 3. 对已有函数增加额外功能的函数
def fun_outer(func):
    def fun_inner():
        func()
        print('这是我添加的额外功能')

    return fun_inner


def comment():
    print('这是我的已有函数!')  # 1. 函数源代码不修改


comment = fun_outer(comment)
comment()  # 2. 函数调用方式不变

在这里插入图片描述

如果外部函数的参数是函数类型,并且在内部函数调用,那么这个闭包就是装饰器。
在这里插入图片描述

2. 语法糖

def fun_outer(func):
    def fun_inner():
        func()
        print('这是我添加的额外功能')

    return fun_inner

# 当执行到下面这一步时,它会先调用fun_outer(),并且将函数comment当作实参传递,也就是comment = fun_outer(comment)
@fun_outer  # 等价于 comment = fun_outer(comment)
def comment():
    print('这是我的已有函数!')


comment()
'''
注意:
1. 语法糖和函数中间不可以添加任何代码,并且后面必须跟被装饰函数
2. 语法糖放在那个函数前面,那么它修饰的就是那个函数
'''

可以打上几个断点 观察详细运行结果:
在这里插入图片描述

3. 装饰器装饰和调用哪个先进行?

def fun_outer(func):
    print('1')

    def fun_inner():
        print('2')
        func()
        print('3')

    print('4')
    return fun_inner


@fun_outer
def comment():
    print('这是我的已有函数!')


# comment() # 可以看到如果不调用comment()时,也会打印 1和4

'''
注意:
    装饰器不是在调用时开始装饰的,而是运行到13行的时候就开始进行装饰了。
'''

在这里插入图片描述

4. 练习:从1打印到10000执行的时间

import time


def fun_outer(func):
    def fun_inner():
        # 1. 获取函数执行前,距离1970. 0:0:0的时间
        begin = time.time()
        func()
        # 2. 获取函数执行后,距离1970. 0:0:0的时间
        end = time.time()
        # 3. 使用结束时间 - 开始时间
        res = end - begin
        print('函数执行所耗时:', res)

    return fun_inner


@fun_outer
def work():
    for i in range(10000):
        print(i)


work()

在这里插入图片描述

5. 装饰器的应用

1. 装饰带有参数的函数

def fun_outer(func):
    def fun_inner(a, b):
        print('正在计算 {} + {}'.format(a, b))
        func(a, b)
        print('计算完毕!')

    return fun_inner


@fun_outer
def add(a, b):
    c = a + b
    print('{} + {} = {}'.format(a, b, c))


add(1, 2)

在这里插入图片描述

2. 装饰带有参数和返回值的函数

def fun_outer(func):
    def fun_inner(a, b):
        print('正在计算 {} + {}'.format(a, b))
        res = func(a, b)
        return res

    return fun_inner


@fun_outer
def add(a, b):
    return a + b


sum_a_b = add(1, 2)
print(sum_a_b)

在这里插入图片描述
注意:
如果没有返回值,默认为None
在这里插入图片描述

3. 装饰带有不定长参数和返回值的函数

def fun_outer(func):
    def fun_inner(*args, **kwargs):
        print('正在执行加法运算:')
        num = func(*args, **kwargs)
        return num

    return fun_inner


@fun_outer
def add_num(*args, **kwargs):  # 不定长参数:*包裹位置参数(元组),**包裹关键字参数 (字典)
    result = 0
    for i in args:
        result += i
    for value in kwargs.values():
        result += value
    return result


re = add_num(1, 2, a=10, b=20)
print(re)

在这里插入图片描述

4. 带参数的装饰器

def def_outer(a=0):
    def fun_outer(func):
        def fun_inner():
            print('参数:', a)
            func()

        return fun_inner

    return fun_outer


@def_outer(6)
def comment():
    print("hello world")


comment()

在这里插入图片描述

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-05-21 18:55:28  更:2022-05-21 18:56:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 15:56:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码