### 介绍
装饰器不仅可以是函数,也可以是类,用法与函数装饰器并没有太大区别,实质是使用类中的__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
为装饰器类)