用Python类实现装饰器

用Python类实现装饰器

为什么使用类实现装饰器?

在某些情况下,我们可能希望装饰器保存状态、初始化一些参数,或者通过对象的方法操作。这时,用类实现装饰器会显得更为灵活和合理。类装饰器允许我们:

  • 通过类的属性来存储状态。
  • 利用类的构造函数传递参数。
  • 通过类方法提供复杂的行为逻辑。

类装饰器的实现

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

    def __call__(self, *args, **kwargs):
        print("Function is being called from class-based decorator")
        return self.func(*args, **kwargs)

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

say_hello()

在这个例子中,MyDecorator 类的 init 方法接收被装饰的函数,并将其保存为类的一个属性。call 方法则使该类的实例可以像函数一样被调用,这就是为什么我们可以像函数装饰器一样使用 @MyDecorator 来装饰 say_hello 函数。

增加状态的类装饰器

通过类装饰器,我们可以轻松地维护状态。假设我们想跟踪某个函数被调用的次数,可以通过以下方式实现:

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

    def __call__(self, *args, **kwargs):
        self.count += 1
        print(f"Function has been called {self.count} times")
        return self.func(*args, **kwargs)

@CallCounter
def greet(name):
    print(f"Hello, {name}!")

greet("Alice")
greet("Bob")

带参数的类装饰器

类装饰器的另一个强大功能是能够接收参数。为了实现这一点,我们可以通过 init 方法接受更多的参数。假设我们想实现一个带有自定义前缀的日志记录器,可以这样写:

python 复制代码
class Logger:
    def __init__(self, prefix):
        self.prefix = prefix

    def __call__(self, func):
        def wrapper(*args, **kwargs):
            print(f"{self.prefix}: Function {func.__name__} is called")
            return func(*args, **kwargs)
        return wrapper

@Logger("INFO")
def process_data(data):
    print(f"Processing {data}")

process_data("Dataset 1")
相关推荐
君顾114 小时前
智慧零售实战指南:从技术架构到落地方案全解析
java·开发语言·零售
南棱笑笑生15 小时前
20260904实测给飞凌OK3576-C开发板刷入Rockchip原厂的IMG固件【使用飞凌的DTS】切换串口波特率为1.5Mbps
c语言·开发语言·rockchip
问天_观心15 小时前
大模型微调学习(二)
人工智能·python·深度学习·学习·语言模型·transformer
洋洋不叫杨杨15 小时前
揭秘当下知名的SEO优化渠道,你知道几个?
大数据·python
阿童木写作15 小时前
跨境图片翻译工具推荐:批量处理视频字幕与智能抠图
python·音视频
平头哥技术团队15 小时前
Day 10 | 工欲善其事:VS Code 配置与项目归档
android·开发语言·前端·javascript·html·交互
乌萨奇也要立志学C++15 小时前
【洛谷】kmp算法
开发语言·算法
梦想的颜色15 小时前
OCR 识别原理与 Python 识图全实战:从文字提取到图像内容理解
python·计算机视觉·ocr·图像识别·python 识图
禹凕15 小时前
Dijkstra算法详解与应用
python·算法
传奇开心果编程15 小时前
【Rust入门知识点学与练】第4课:条件判断 if / else
开发语言·学习·rust