类装饰器

类装饰器

不过尔尔 19 2023-12-03

### 介绍

装饰器不仅可以是函数,也可以是类,用法与函数装饰器并没有太大区别,实质是使用类中的__call__方法来实现的.

作为装饰器:

  • 只需要在类中定义一个__call__方法,当被装饰函数运行时就会调用类装饰器中的__call__方法并执行其中的代码。

    • __call__方法,使类的实例化对象可以像调用普通函数那样,以“对象名()”的形式使用。

     class CallMe:
         # 定义__call__方法
         def __call__(self, name, phone):
             print("调用__call__()方法", name, phone)
     ​
     ​
     call_me = CallMe()
     call_me("萧炎", "9090")

    输出:

     调用__call__()方法 萧炎 9090

分类

1,无参装饰器

 class Decorator(object):
     def __init__(self, func):
         self.func = func
 ​
     def __call__(self, *args, **kwargs):
         print("调用hi函数之前")
         self.func(*args, **kwargs)
         print("调用hi函数之后")
 ​
 @Decorator
 def hi():
     print("hello")
 ​
 hi()

输出:

 调用hi函数之前
 hello
 调用hi函数之后

2,有参装饰器

 from functools import wraps
 ​
 class Decorator(object):
     def __init__(self, x, y):
         self.x = x
         self.y = y
         ...
 ​
     def __call__(self, func):
         @wraps(func)
         def wrapper(*args, **kwargs):
             print("调用hi函数之前====我被打印了", self.x, self.y, "=====")
             res = func(*args, **kwargs)
             print("调用hi函数之后")
             return res
         return wrapper
 ​
 @Decorator("我是X", "我是Y")
 def hi():
     print("hello")
     return 
 ​
 hi()

输出:

 调用hi函数之前====我被打印了 我是X 我是Y =====
 hello
 调用hi函数之后

4,使用方法

在被装饰函数的上方加上@装饰器类名(示例中的hi为被装饰函数,Decorator为装饰器类)