python 装饰器

欢迎访问我的博客首页


装饰器

  • [1. 函数装饰函数](#1. 函数装饰函数)
    • [1.1 基础装饰器](#1.1 基础装饰器)
    • [1.2 装饰器工厂](#1.2 装饰器工厂)
  • [2. 函数装饰类](#2. 函数装饰类)
  • [3. 类装饰函数](#3. 类装饰函数)
  • [4. 类装饰类](#4. 类装饰类)
  • [5. 参考](#5. 参考)

1. 函数装饰函数


用函数装饰函数的装饰器。

1.1 基础装饰器


下面定义一个名为 decorator 的装饰器。functools.wraps 用于还原函数名。

python 复制代码
import functools

def decorator(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print('original func name:', func.__name__)
        return func(*args, **kwargs)

    return wrapper

下面是使用装饰器 decorator 装饰函数 test1_1 和 test1_2 的例子。

python 复制代码
@decorator
def test1_1():
    return 'hello world1_1'

def test1_2():
    return 'hello world1_2'

test1_2 = decorator(test1_2)

if __name__ == '__main__':
    print(test1_1())
    print()
    print(test1_2())

装饰函数的函数,可以预处理被装饰函数的参数。基于 python 的 web 应用程序的后端框架经常用这样的装饰器作为登录验证,比如 flask 框架。

1.2 装饰器工厂


下面是带参数的装饰器及其用法。

python 复制代码
def decorator_factor(param=0):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            print('original func name:', func.__name__)
            print('param:', param)
            return func(*args, **kwargs)

        return wrapper

    return decorator

@decorator_factor(param=2)
def test2():
    return 'hello world2'
    
if __name__ == '__main__':
    print(test2())

装饰器工厂用于控制被装饰函数的执行次数,以及统计被装饰函数的耗时等。

2. 函数装饰类


用函数装饰类的装饰器,以单例模式为例。

python 复制代码
def singleton(cls):
    instance = {}

    def create(*args, **kwargs):
        if cls not in instance:
            param = args[0]
            instance[cls] = cls(param + 1)
        return instance[cls]

    return create

@singleton
class Example:
    def __init__(self, x):
        print('--构造函数, x=', x)

    def __del__(self):
        print('--析构函数')

if __name__ == '__main__':
    a = Example(1)
    b = Example(1)
    print(id(a))
    print(id(b))

装饰类的函数,可以预处理被装饰类的构造函数的参数,也可以控制被装饰函数的对象的创建。

3. 类装饰函数


用类装饰函数的装饰器。

python 复制代码
class Decorator:
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        param = args[0]
        param += 1
        return self.func(param)

@Decorator
def fac(param):
    return param

if __name__ == '__main__':
    print(fac(1))

装饰函数的类,可以预处理被装饰函数的参数。

4. 类装饰类


用类装饰类的装饰器,以单例模式为例。

python 复制代码
class Singleton:
    instance = None

    def __init__(self, cls):
        self.cls = cls

    def __call__(self, *args, **kwargs):
        if not self.instance:
            self.instance = self.cls(*args, **kwargs)
        return self.instance

@Singleton
class Example:
    def __init__(self):
        print('--构造函数')

    def __del__(self):
        print('--析构函数')

if __name__ == '__main__':
    a = Example()
    b = Example()
    print(id(a))
    print(id(b))

装饰类的类,可以预处理被装饰类的构造函数的参数,也可以控制被装饰函数的对象的创建。

5. 参考


  1. 装饰器工厂,CSDN,2022。
  2. python 单例模式,CSDN,2023。
  3. 函数与类相互装饰,CSDN,2023。
相关推荐
Bruce_kaizy2 分钟前
c++单调数据结构————单调栈,单调队列
开发语言·数据结构·c++
阿坤带你走近大数据7 分钟前
Python基础知识-数据结构篇
开发语言·数据结构·python
froginwe117 分钟前
AJAX 实时搜索:技术原理与实现方法
开发语言
小智RE0-走在路上10 分钟前
Python学习笔记(7)--集合,字典,数据容器总结
笔记·python·学习
沃斯堡&蓝鸟12 分钟前
DAY 29 异常处理
python
发光小北12 分钟前
SG-CAN (FD) NET-210(双通道 CAN (FD) 转以太网网关)特点与功能介绍
开发语言·网络·php
Direction_Wind15 分钟前
抓包的使用与讲解
python
职业码农NO.115 分钟前
智能体推理范式: Plan-and-Execute(规划与执行)
人工智能·python·数据分析·系统架构·知识图谱·agent·集成学习
liangshanbo121537 分钟前
深入理解 Model Context Protocol (MCP):从原理到实践
开发语言·qt·microsoft
爱笑的眼睛1140 分钟前
超越`cross_val_score`:深入剖析Scikit-learn交叉验证API的设计哲学与高阶实践
java·人工智能·python·ai