Python 使用类实现装饰器

简介: Python 使用类实现装饰器

一、前置说明


1、本节目标

  • 了解如何使用类实现装饰器


2、相关回顾


二、主要内容


1、基本原理

  • 定义一个类,__init__ 方法用于初始化装饰器的状态, __call__ 方法用于定义在调用被装饰函数时所执行的逻辑。
  • 通过类创建一个可调用对象(类的实例),该对象在被调用时执行 __call__ 方法中的装饰逻辑。


2、Demo 示例

示例 1:简单的类装饰器

import functools
class SimpleDecorator:
    def __init__(self, func):
        self.func = func
        functools.wraps(func)(self)
    def __call__(self, *args, **kwargs):
        print("Before function execution")
        result = self.func(*args, **kwargs)
        print("After function execution")
        return result
@SimpleDecorator
def my_function():
    """This is the original function."""
    print("Function is being executed")
my_function()
print(my_function.__name__)  # 输出 "my_function"


输出结果:

Before function execution
Function is being executed
After function execution
my_function


在这个例子中,SimpleDecorator 类实现了一个简单的装饰器,它在被装饰函数执行前后打印额外的信息。


  • 使用 @SimpleDecorator 装饰函数 my_function 时,相当于执行了: my_function = SimpleDecorator(my_function)
  • my_functionSimpleDecorator 类的实例,由于在类中定义了 __call__ 方法,因此 my_function 是一个可调用对象,可以像函数一样调用。
  • 执行 my_function() 时,调用 __call__ 方法中定义的装饰逻辑,实现装饰器的效果。


functools.wraps(func)(self) 的理解:


  • functools.wraps(func)(self)等价于两个步骤:
  • 创建装饰器:decorator = functools.wraps(func)
  • 使用装饰器:decorator(self)
  • decorator = functools.wraps(func) 的作用是将函数 func 的元信息(如名称、文档字符串等)复制给被装饰函数(在这里是 __call__ 方法)。
  • decorator(self) 的作用将 __call__ 方法的实例对象传递给 decorator 装饰器,这个过程实际上是在调用 decorator 装饰器,并将 __call__ 方法作为参数传递进去。


示例 2:带参数的类装饰器

import functools
class ParametrizedDecorator:
    def __init__(self, param):
        self.param = param
    def __call__(self, func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            print(f"Decorator parameter: {self.param}")
            for i in range(self.param):
                func(*args, **kwargs)
        return wrapper
@ParametrizedDecorator(param=3)
def greet(name):
    print(f"Hello, {name}!")
greet("Alice")
print(greet.__name__)  # 输出 "greet"


输出结果:

Decorator parameter: 3
Hello, Alice!
Hello, Alice!
Hello, Alice!
greet


这个例子中,ParametrizedDecorator 接受一个参数,并在装饰函数执行前打印该参数。


  • 使用 @ParametrizedDecorator(param=3) 装饰 greet 函数,相当于:greet = ParametrizedDecorator(param=3)(greet)
  • 在执行 ParametrizedDecorator(param=3)(greet) 时,调用了 __call__ 方法,返回一个新的 wrapper 函数,此时 greet
    方法相当于 wrapper 函数的引用。
  • 执行 greet("Alice") 等同于执行 wrapper("Alice"),从而实现了装饰器的效果。


三、后置说明


1、要点小结

  • 在类中定义 __call__ 方法,可以将类的实例变为可调用对象,使其可以像函数一样被调用。
  • 当对象被调用时,会执行 __call__ 方法中的逻辑。可利用这一特性通过定义 __call__ 方法中的逻辑实现装饰效果。
  • 可以通过在 __init__ 方法中接受参数来实现带参数的类装饰器,这使得类装饰器更加灵活,可以根据传递的参数定制装饰行为。


2、下节准备

  • Python 使用装饰器隐式装饰一个类中的所有方法

点击进入《Python装饰器从入门到进阶》总目录

目录
相关文章
|
3天前
|
缓存 开发者 Python
Python中的装饰器:提升代码灵活性与可复用性
众所周知,Python作为一门流行的编程语言,其装饰器(Decorator)机制为代码的优化和重用提供了强大支持。本文将深入探讨Python中装饰器的概念、用法和实际应用,帮助读者更好地理解并应用这一技术,从而提升代码的灵活性和可复用性。
|
3天前
|
缓存 Python
Python中的装饰器应用及实践
Python中的装饰器是一种强大的编程工具,它可以在不更改原函数代码的情况下,对函数进行扩展和修改。本文将介绍装饰器的基本概念,探讨其在Python开发中的实际应用,并结合示例代码进行详细解析。
|
3天前
|
缓存 测试技术 Python
Python中的装饰器应用探究
在Python编程中,装饰器是一种强大而灵活的工具,它可以用于修改、包装和增强函数或方法的行为。本文将深入探讨Python中装饰器的应用,包括装饰器的基本概念、实际应用场景以及一些高级技巧,帮助读者更好地理解和运用这一重要的编程技术。
|
3天前
|
程序员 开发者 Python
Python中的装饰器:优雅而强大的函数修饰工具
在Python编程中,装饰器是一种强大的工具,它可以简洁地实现函数的增强、扩展和重用。本文将深入探讨Python中装饰器的工作原理、常见应用场景以及如何自定义装饰器,帮助读者更好地理解和运用这一重要的编程概念。
|
3天前
|
缓存 开发者 Python
Python中的装饰器:提升代码灵活性和可维护性
Python中的装饰器是一种强大的工具,它可以帮助开发者提升代码的可维护性和灵活性。本文将深入探讨Python装饰器的原理、用法以及实际应用场景,帮助读者更好地理解并运用装饰器来优化自己的代码。
|
4天前
|
缓存 Python
Python中的装饰器:优雅而强大的函数装饰技术
在Python编程中,装饰器是一种强大而灵活的技术,它可以使函数具有额外的功能,而不需要改变函数的核心代码。本文将深入探讨装饰器的原理、用法以及实际应用场景,帮助读者更好地理解和利用这一重要的Python编程工具。
|
5天前
|
Python
Python-类视图和蓝图
Python-类视图和蓝图
11 2
|
5天前
|
存储 Java 数据安全/隐私保护
Python----类对象和实例对象
Python----类对象和实例对象
9 2
|
6天前
|
测试技术 Python
解密Python中的装饰器:提升代码可读性与灵活性
Python中的装饰器是一种强大的工具,能够在不改变原有函数结构的情况下,为函数添加额外功能。本文将深入探讨装饰器的原理及应用,介绍装饰器的基本语法和常见用法,并结合实例演示如何利用装饰器提升代码的可读性和灵活性,使代码更加简洁、模块化和易于维护。
|
6天前
|
监控 Python
Python中的装饰器:提升代码灵活性和可维护性
在Python编程中,装饰器是一种强大的工具,可以提高代码的灵活性和可维护性。本文将深入探讨装饰器的概念、用法和实际应用,帮助读者更好地理解并运用装饰器来优化自己的Python代码。