首页 > 编程语言 >python装饰器底层原理

python装饰器底层原理

时间:2025-01-21 21:54:03浏览次数:1  
标签:function return python args func print 装饰 def 底层

什么是装饰器

装饰器是Python中的一种特殊函数,主要用于修改或扩展其他函数或方法的功能,而无需修改函数本身的代码。它们通常通过在函数定义前加上@装饰器名称来使用。

@decorator_function
def my_function():
    pass
​
   

装饰器的基本结构

一个基本的装饰器包含一个函数,它接受另一个函数作为参数,并返回一个新的函数。这个新的函数通常会在调用时执行一些附加操作,然后调用原始函数。

def simple_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper
​
   

使用该装饰器:

@simple_decorator
def say_hello():
    print("Hello!")

say_hello()
​
   

输出:

Something is happening before the function is called.
Hello!
Something is happening after the function is called.
​
   

装饰器的底层原理

为了理解装饰器的底层原理,我们需要了解以下几个方面:

1. 函数是对象

在Python中,函数是第一类对象。这意味着函数可以作为参数传递给另一个函数,可以作为另一个函数的返回值,也可以赋值给变量。

def foo():
    print("Hello from foo")

bar = foo
bar()
​
   

输出:

Hello from foo
​
   

2. 闭包

闭包是一种函数,它保留了定义它的环境中的变量。装饰器利用了闭包来包装函数并添加额外的功能。

def outer_func(msg):
    def inner_func():
        print(msg)
    return inner_func

hi_func = outer_func("Hi")
hi_func()
​
   

输出:

Hi
​
   

3. 高阶函数

装饰器本质上是高阶函数,它们接受函数作为参数,并返回一个新函数。

def decorator_function(original_function):
    def wrapper_function():
        print("Wrapper executed this before {}".format(original_function.__name__))
        return original_function()
    return wrapper_function

@decorator_function
def display():
    print("display function ran")

display()
​
   

输出:

Wrapper executed this before display
display function ran
​
   

常见装饰器模式

无参数装饰器

这是最基本的装饰器模式。它不接受任何参数,只接受一个函数作为参数。

def my_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper
​
   

带参数的装饰器

带参数的装饰器可以接受额外的参数。实现这种装饰器时,需要再嵌套一层函数。

def decorator_with_args(arg1, arg2):
    def decorator(func):
        def wrapper(*args, **kwargs):
            print(f"Arguments passed to decorator: {arg1}, {arg2}")
            return func(*args, **kwargs)
        return wrapper
    return decorator

@decorator_with_args("Hello", "World")
def say_hello():
    print("Hello!")

say_hello()
​
   

输出:

Arguments passed to decorator: Hello, World
Hello!
​
   

类装饰器

类装饰器通过实现 __call__方法,可以像函数装饰器一样工作。

class ClassDecorator:
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        print("ClassDecorator: Before the function call.")
        result = self.func(*args, **kwargs)
        print("ClassDecorator: After the function call.")
        return result

@ClassDecorator
def say_hello(name):
    print(f"Hello, {name}!")

say_hello("Alice")
​
   

输出:

ClassDecorator: Before the function call.
Hello, Alice!
ClassDecorator: After the function call.
​
   

装饰器的实际应用

日志记录

装饰器可以用于记录函数调用的日志。

def log_decorator(func):
    def wrapper(*args, **kwargs):
        print(f"Function {func.__name__} called with arguments {args} and keyword arguments {kwargs}")
        return func(*args, **kwargs)
    return wrapper

@log_decorator
def add(x, y):
    return x + y

result = add(5, 3)
​
   

输出:

Function add called with arguments (5, 3) and keyword arguments {}
​
   

访问控制与权限验证

装饰器可以用于检查用户是否具有执行某些操作的权限。

def require_authentication(func):
    def wrapper(user, *args, **kwargs):
        if not user.is_authenticated:
            print("User is not authenticated.")
            return
        return func(user, *args, **kwargs)
    return wrapper

@require_authentication
def view_profile(user):
    print(f"Displaying profile for {user.name}")

# 假设User类和user对象已经定义
view_profile(user)
​
   

缓存

装饰器可以用于缓存函数的结果,提高性能。

def cache(func):
    cached_results = {}

    def wrapper(*args):
        if args in cached_results:
            return cached_results[args]
        result = func(*args)
        cached_results[args] = result
        return result

    return wrapper

@cache
def compute_square(n):
    return n * n

print(compute_square(4))
print(compute_square(4))  # 这次将使用缓存结果

标签:function,return,python,args,func,print,装饰,def,底层
From: https://www.cnblogs.com/mybook000/p/18684513

相关文章

  • Python 设计Gui 工具
    Python设计Gui工具:1、Pygubu-Designer:一个简单的GUI设计工具 ,用于快速开发Pythontkinter模块用户界面的RAD工具    https://github.com/alejandroautalan/pygubu-designer   安装:pipinstallpygubu-designer2、wxformbuilder    https://gith......
  • Redis数据库笔记——ZSet的底层实现(跳表)
    大家好,这里是GoodNote,关注公主号:Goodnote,专栏文章私信限时Free。本文详细介绍ZSet数据类型中跳表的底层实现,包括基本特点和常用操作。文章目录ZSet(有序集合)概述基本特点底层实现Skiplist跳表概述结构跳表的基本操作1.查找操作:`Search`2.插入操作:`Insert`3.删......
  • 图解 Python 编程(7) | Python面向对象的程序设计
    ......
  • Python----Python高级(文件操作open,os模块对于文件操作,shutil模块 )
    一、文件处理1.1、文件操作的重要性和应用场景 1.1.1、重要性 数据持久化:        文件是存储数据的一种非常基本且重要的方式。通过文件,我们可以将程序运行时产生的数据永久保存下来,以便将来使用。跨平台兼容性:        文件是一种通用的数据交换格......
  • 【金融资产组合模型进化论】5. 马科维茨资产组合模型+AI金融智能体(qwen-max)+政策信
    目录0.承前1.AI金融智能体1.1WhatisAI金融智能体1.2WhyisAI金融智能体1.3HowtoAI金融智能体2.数据要素&计算流程2.1参数集设置2.2数据获取&预处理2.3收益率计算2.4因子构建与预期收益率计算2.5协方差矩阵计算2.6投资组合优化2.7持仓筛选2.8AI金融智......
  • 利用Python爬虫与1688 API接口:高效获取商品搜索数据
    在当今电商竞争激烈的市场中,数据的价值不言而喻。无论是商家、市场分析师还是电商运营者,都需要快速、准确地获取商品信息,以便制定策略、优化运营和洞察市场趋势。1688作为国内领先的B2B电商平台,提供了丰富的API接口,尤其是按关键字搜索商品的接口(item_search),为开发者和数据分析师提......
  • 如何使用 Python 进行文件读写操作?
    大家好,我是V哥。今天的内容来介绍Python中进行文件读写操作的方法,这在学习Python时是必不可少的技术点,希望可以帮助到正在学习python的小伙伴。以下是Python中进行文件读写操作的基本方法:一、文件读取:#打开文件withopen('example.txt','r')asfile:#读取文......
  • Python教程1(新手绝对看得懂)
    其实很多人不太能够清楚理解一些基础知识原理,这也是我做这个的初衷。相信大家跟着我一定会有进步的,加油下一个py大佬就是你。   大家好我们在学Python的时候先带大家来了解一下Python1.Python基本语法我们先从最基本的开始哦!Python的语法非常简洁,每一行代码就像一个......
  • js条件判断的类python海象写法
    判断里面赋值就OK啦varss="higooh"constreg=/\w{2}/gconstii=ss.matchAll(reg)while(_=ii.next()){if(_.done)breakconsole.log(_.value,_.done)ss=ss.replace(_.value[0],"xx")}//console.log(_)console.log(......
  • 我的 Python 学习之旅:从入门到实践
    在当今数字化时代,编程语言成为了开启无数可能的钥匙,而Python以其简洁易读、功能强大的特性吸引了众多学习者。我也踏上了这条学习Python的奇妙旅程,下面就来分享一下我的学习过程。一、学习动机的萌芽最初接触Python,是听闻它在数据科学、人工智能、自动化脚本等多个领域......