首页 > 编程语言 >千字长文讲解python装饰器

千字长文讲解python装饰器

时间:2024-07-20 12:56:25浏览次数:16  
标签:__ 函数 fn python inner 长文 千字 装饰 def

1.装饰器是一个用于封装函数或类的代码的工具。它显式的将封装器应用到函数或类上,从而使它们选择加入到装饰器的功能中【装饰器不仅可以装饰函数,也可以装饰类】。
2.对于①在函数运行前处理常见前置条件(例如确认授权),或②在函数运行后确保清理(例如输出清除或异常处理)装饰器都非常有用
a.①

def decorator_func():
    // do something
    decorated_func()

b.②

def decorator_func():
    decorated_func()
    // do something

3.对于处理已经被装饰的函数或类本身,装饰器也很有用。例如,装饰器可以将函数注册到信号系统?,或者注册到Web应用程序的URI注册表中。
4.究其核心而言,装饰器就是一个可以接受调用也可以返回调用的调用。装饰器无非就是一个函数(或调用,如有_call_method_方法的对象),该函数接受被装饰的函数作为其位置参数。装饰器通过使用该参数来执行某些操作,然后返回原始参数或一些其他的调用(大概以这种方式与编译器交互)
5.由于函数在python中是一级对象?,因此它们能够像其他对象一样被传递到另一个函数。装饰器就是接受另一个函数作为参数,并用其完成一些操作的函数。
6.@decorator_func是在Python 2.5引入的
7.对某个可调用函数,可以使用多个装饰器。如果通过@语法使用多个装饰器,就可以按照自底向上的顺序来应用它们。
首先发生的是解释器创建add函数,然后应用decorated_by装饰器。该装饰器返回了一个可调用函数,该函数被发送给also_decorated_by装饰器,also_decorated_by也做了同样的事情,接下来结果被赋给add函数。

@also_decorated_by
@decorated_by
def add(x, y):
    return x + y

8.如果要使一个类上的方法不需要这个类的实例,可以使用@classmethod或@staticmethod。
9.mock模块允许使用@mock.patch或@mock.patch.object作为装饰器。
10.Celery(常见的Python任务运行工具)使用复杂的@task装饰器来标识函数是否为异步任务。
11.编写装饰器的时机
a.附加功能
b.数据的清理或添加
c.函数注册
12.装饰器通常接受被装饰的可调用函数作为唯一参数,并且返回一个可调用函数
13.示例
a.函数注册表
b.执行时封装代码
i.functools.wraps
14.常见装饰器写法

def outer(func):
    def inner():
        print('do something here')
        func()
    return inner


def my_func():
    print('this is my_func')


my_func = outer(my_func)

my_func()

'''
do something here
this is my_func
'''

15.装饰器的作用:在不改变已有函数的源代码的情况下,给函数增加新的功能
16.装饰器的功能特点
a.不修改已有函数的源代码
b.给已有函数增加额外的功能
17.装饰器符合了开发中的封闭开放原则
18.装饰器的本质是闭包
19.装饰器就是把一个函数当做参数传递给闭包中的外部函数,同时在内部函数中使用这个函数,并给它添加新的功能
20.装饰带有参数的函数:让inner函数的参数和被装饰函数的参数保持一致

def logging(fn):
    def inner(a, b):
        res = fn(a, b)
        print(res)
    return inner


@logging
def sum_num(a, b):
    res = a + b
    return res


sum_num(1, 2)
'''
3
'''

21.装饰带有返回值的函数:在inner函数中返回被装饰函数的返回值即可

def logging(fn):
    def inner(a, b):
        res = fn(a, b)
        return res
    return inner


@logging
def sum_num(a, b):
    res = a + b
    return res


print(sum_num(1, 2))
'''
3
'''
  1. 装饰带有不定长参数的函数
def logging(fn):
    def inner(*args, **kwargs):
        fn(*args, **kwargs)
    return inner


@logging
def sum_num(*args, **kwargs):
    print(args, kwargs)


sum_num(1, 2, 3, age=18)

'''
(1, 2, 3) {'age': 18}
'''

23.通用装饰器

 def logging(fn):
    def inner(*args, **kwargs):
        return fn(*args, **kwargs)
    return inner


@logging
def sum_num(*args, **kwargs):
    print(args, kwargs)


sum_num(1, 2, 3, age=18)

'''
(1, 2, 3) {'age': 18}
'''
  1. 带有参数的装饰器
    a.装饰器的外部函数只能接受被装饰的函数这一个参数
    b.如果需要给装饰器传参数需要在装饰器外部再增加一个函数
def logging(flag):
    def decorator(fn):
        def inner(num1, num2):
            print(flag, fn(num1, num2))
        return inner
    return decorator


@logging('abc')
def add(a, b):
    return a + b


add(1, 2)

'''
abc 3
'''

25.__call__方法的使用
a.如果一个类实现了__call__方法,那么这个类创建的对象就是一个可调用对象,可以像函数一样进行调用

class Check(object):
    def __call__(self, *args, **kwargs):
        print('this is __call__ function')


c = Check()
c()
'''
this is __call__ function
'''

26.类装饰器

class Check(object):
    def __init__(self, fn):
        self.__fn = fn

    def __call__(self, *args, **kwargs):
        print('验证')
        self.__fn()


@Check
def comment():
    print('发表评论')


comment()

'''
验证
发表评论
'''

标签:__,函数,fn,python,inner,长文,千字,装饰,def
From: https://blog.csdn.net/qq_32862515/article/details/140569520

相关文章

  • 蓝桥杯Python算法竞赛常用的函数库
    博客主页:音符犹如代码系列专栏:Python关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞......
  • 【python模块】Selenium
    声明:本文档或演示材料仅供教育和教学目的使用,任何个人或组织使用本文档中的信息进行非法活动,均与本文档的作者或发布者无关。文章目录Selenium库功能介绍环境准备示例代码Selenium库Selenium库是一个强大的Web自动化工具,允许开发者通过编写脚本来控制浏览器,实现......
  • 深入理解与高效操作Python中的字节流(bytes)与字节数组(bytearray)
    深入理解与高效操作Python中的字节流(bytes)与字节数组(bytearray)在Python编程中,处理字节流(bytes)和字节数组(bytearray)是常见的需求,尤其是在处理网络通信、文件I/O、以及需要直接与硬件交互的场景中。理解这两种数据类型的特性及它们之间的区别,并掌握高效的操作方法,对于提升程......
  • Python中的`@property`装饰器:深入解析与实战应用
    Python中的@property装饰器:深入解析与实战应用在Python中,@property装饰器是一种强大的工具,它允许类的方法被当作属性来访问。这一特性极大地增强了类的封装性和易用性,使得类的外部使用者可以像访问普通属性一样访问由方法计算或处理过的数据,而无需直接调用这些方法。本文将......
  • 【python模块】Http.client
    文章目录Http.client介绍基本用法高级用法Http.client介绍http.client是Python标准库中的一个模块,它提供了一个低级别的接口来发送HTTP请求和接收响应。这个模块主要针对HTTP协议的实现,并且可以用于创建更复杂的HTTP客户端。基本用法http.client模块允......
  • 掌握Python中的文件序列化:Json和Pickle模块解析
    Python文件操作与管理:Open函数、Json与Pickle、Os模块在Python中,文件是一个重要的数据处理对象。无论是读取数据、保存数据还是进行数据处理,文件操作都是Python编程中不可或缺的一部分。本文将详细介绍Python中文件操作的几种常用方法,包括open函数的使用、数据序列化与反......
  • PYTHON学习笔记(六、python数据结构--字典)
    (3)dict字典字典数据类型的含义是:根据一个信息查找另一个信息的方式构成了“键值对”,它表示索引用的键和对应的值构成对应的关系。1、字典的创建方式1)使用{ }直接创建字典使用{ }创建字典的语法结构如下:d={key1:value1,key2:value2......}例如:#使用{}创建字典d=......
  • Python 爬虫技术 第01节 引言
    引言网络爬虫的概念和重要性网络爬虫(WebCrawler),也称为网络蜘蛛(WebSpider)或机器人(Bot),是一种自动浏览互联网并收集信息的程序。它们按照一定的规则,从一个网页链接到另一个网页,遍历整个网络,抓取所需的数据或信息。网络爬虫是搜索引擎、数据分析、市场研究、新闻聚合、学术......
  • 彩色文本,Python print() 居然还能这样玩?
    大家好,在学习Python编程的过程中,我们习惯于使用print()函数来输出文本。然而,许多人不知道的是,print()函数不仅能输出普通的黑白文本,还能输出彩色文本。原理终端与ANSI转义序列在深入代码之前,我们需要了解一些基础知识。终端(Terminal)是我们与操作系统交互的重要工具,而......
  • 简单python游戏开发,使用Pyglet创建你的第一个游戏
    更多高质量Python、副业教程记得关注公众号【软件测试圈】你是否想过用Python编写一个小游戏或者一个图形化应用?Pyglet可能就是你所需要的工具。Pyglet是一个强大的Python库,它允许你创建跨平台的多媒体应用程序。什么是Pyglet?Pyglet是一个Python库,用于编写跨平台的多......