Python中的装饰器:让你的代码更优雅

柯里极昼
• 阅读 628

摘要: 本文将为您详细介绍Python装饰器的概念、用法和应用场景,帮助您编写更简洁、优雅的代码。


正文:

1. 什么是装饰器?

装饰器(Decorator)是Python中一种用于修改函数或类的行为的设计模式。装饰器允许您在不修改原始函数或类的情况下,给它们添加新的功能,这使得代码更具可重用性和可扩展性。简而言之,装饰器就像一个包装,它可以为被装饰的函数或类添加一些额外的功能。

2. 如何使用装饰器?

装饰器的基本用法很简单,只需在函数或类定义前加上一个 @decorator 语法糖即可。下面我们来看一个简单的例子:

def my_decorator(func):
    def wrapper():
        print("Do something before the function is called.")
        func()
        print("Do something after the function is called.")
    return wrapper

@my_decorator
def say_hello():
    print("Hello, world!")

say_hello()

运行以上代码,你将会看到如下输出:

Do something before the function is called.
Hello, world!
Do something after the function is called.

在这个例子中,我们定义了一个名为 my_decorator 的装饰器,它接受一个函数作为参数,并返回一个新的函数 wrapper。当我们在 say_hello 函数前加上 @my_decorator 时,它的行为被修改了:在原函数执行前后,都会执行一些额外的操作。

3. 应用场景

装饰器在实际开发中有许多应用场景,以下是一些常见的例子:

  • 性能测试:使用装饰器记录函数的执行时间,帮助我们找出性能瓶颈。
import time

def timing_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"{func.__name__} took {end_time - start_time:.2f} seconds to run.")
        return result
    return wrapper

@timing_decorator
def slow_function():
    time.sleep(2)

slow_function()
  • 访问控制:使用装饰器实现用户身份验证、权限检查等功能。
def admin_required(func):
    def wrapper(user, *args, **kwargs):
        if user.is_admin:
            return func(user, *args, **kwargs)
        else:
            raise PermissionError("Only admins can access this function.")
    return wrapper

@admin_required
def restricted_function(user):
    print("You have access to this restricted function.")

class User:
    def __init__(self, is_admin):
        self.is_admin = is_admin

admin = User(is_admin=True)
non_admin= User(is_admin=False)

try: restricted_function(admin) except PermissionError as e: print(e)

try: restricted_function(non_admin) except PermissionError as e: print(e)
  • 日志记录:使用装饰器自动记录函数的调用日志。
import logging

def log_decorator(func):
    def wrapper(*args, **kwargs):
        logging.basicConfig(level=logging.INFO)
        logging.info(f"Function '{func.__name__}' is called with arguments: {args}, {kwargs}")
        result = func(*args, **kwargs)
        logging.info(f"Function '{func.__name__}' has finished.")
        return result
    return wrapper

@log_decorator
def example_function(a, b, c=3):
    print("This is an example function.")
    return a + b + c

example_function(1, 2, c=4)

4. 总结

Python装饰器是一种强大的设计模式,可以让您在不修改原始代码的情况下,为函数或类添加新的功能。通过熟练掌握装饰器,您可以编写出更简洁、优雅的代码,提高开发效率。本文通过实例介绍了装饰器的概念、用法和应用场景,希望能对您有所帮助。

点赞
收藏
评论区
推荐文章
半臻 半臻
4年前
Python基础5——装饰器
13、装饰器其本质:在不需要做任何代码变动的前提下,增加额外的功能。装饰器返回的是一个函数对象。相当于把函数作为参数传递进去,然后对函数进行装饰其本质就是一个闭包作用:1.给原来的函数增加额外的功能2.把原来的函数作为参数传递进去13.1基本用法标准版的装饰器pythondefwrapper(func):func为原来的函数名defin
Irene181 Irene181
4年前
恶补了 Python 装饰器的六种写法,你随便问~
大家好,我是明哥。今天给大家分享一下关于装饰器的知识点,内容非常干,全程高能,认真吸收看完,一定会对装饰器有更深的理解。Hello,装饰器装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰
Karen110 Karen110
4年前
浅析装饰器的那些事儿
一、装饰器的简单定义外层函数返回里层函数的引用,里层函数引用外层函数的变量。二、装饰器的作用通俗来讲装饰器的作用就是在不改变已有函数代码前提下,为该函数增加新的功能。defrun():print('我会跑')fun()现在我想在原有函数的基础上新增一个功能:我会唱歌。这个时候利用装饰器则轻松可以帮我们实现这个功能。三、实例理解(1)不
Bill78 Bill78
5年前
python装饰器详解
你会Python嘛?我会!那你给我讲下Python装饰器吧!Python装饰器啊?我没用过哎以上是我一个哥们面试时候发生的真实对白。\分割线
Wesley13 Wesley13
4年前
ES6 系列之我们来聊聊装饰器
_摘要:_ Decorator装饰器主要用于:1.装饰类2.装饰方法或属性装饰类\\\js@annotation(https://my.oschina.net/annotation)classMyClass{}functionannotation(target){target.annotatedt
Stella981 Stella981
4年前
Python进阶笔记(2)
'''装饰器装饰器(Decorators)是Python的一个重要部分。简单地说:他们是修改其他函数的功能的函数。他们有助于让我们的代码更简短。如果已经接触过FLASK的,想想路由功能。如果没有接触过FLASK的,建议学习下。''''''各种推导式(compre
Stella981 Stella981
4年前
Python 装饰器(Decorator)
Python 装饰器(Decorator)装饰模式有很多经典的使用场景,例如插入日志、性能测试、事务处理等等,有了装饰器,就可以提取大量函数中与本身功能无关的类似代码,从而达到代码重用的目的。下面就一步步看看Python中的装饰器。装饰器本身是一个Python函数,他可以让其他函数在不需要做任何代码变动
Stella981 Stella981
4年前
Python装饰器、内置函数之金兰契友
装饰器:装饰器的实质就是一个闭包,而闭包又是嵌套函数的一种。所以也可以理解装饰器是一种特殊的函数。因为程序一般都遵守开放封闭原则,软件在设计初期不可能把所有情况都想到,所以一般软件都支持功能上的扩展,而对源代码的修改是封闭的。开放封闭原则主要体现在两个方面:对功能扩展开放:意味着有新的需求或变化时,可以对现有代码进行扩展,以适
Stella981 Stella981
4年前
Python装饰器用法实例总结
一、装饰器是什么python的装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。简单的说装饰器就是一个用来返回函数的函数。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离
3A网络 3A网络
3年前
Golang 常见设计模式之装饰模式
Golang常见设计模式之装饰模式想必只要是熟悉Python的同学对装饰模式一定不会陌生,这类Python从语法上原生支持的装饰器,大大提高了装饰模式在Python中的应用。尽管Go语言中装饰模式没有Python中应用的那么广泛,但是它也有其独到的地方。接下来就一起看下装饰模式在Go语言中的应用。简单装饰器我们通过一个简单的例子来
GeorgeGcs GeorgeGcs
8个月前
【HarmonyOS 5】鸿蒙的装饰器原理和自定义装饰器
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、鸿蒙中的装饰器是什么?在ArkTS中装饰器(Decorator)是一种特殊的声明,能够对类、方法、属性等进行标注和修改。因为ArkTS是TypeScript扩展而来的编程语言,Type
柯里极昼
柯里极昼
Lv1
穷且益坚,不坠青云之志。
文章
3
粉丝
0
获赞
0