1.装饰函数
def outer(fun):
def wrapper():
return fun()
return wrapper
2.装饰带参函数
def outer(fun):
def wrapper(*args, **kwargs):
return fun(*args, **kwargs)
return wrapper
3.装饰实例方法
def outer(fun):
def wrapper(self, *args, **kwargs):
return fun(self, *args, **kwargs)
return wrapper
4.函数被装饰后,函数名不改变
import functools
def outer(fun):
@functools.wraps(fun)
def wrapper(self, *args, **kwargs):
return fun(self, *args, **kwargs)
return wrapper
5.装饰器工厂,实现动态装饰函数
def get_args(args_1, args_2)
def outer(fun):
def wrapper(*args, **kwargs):
print(args_1, args_2)
return fun(*args, **kwargs)
return wrapper
return outer
6.装饰器实现单例
import functools
def singleton(cls):
instances = {}
@functools.wraps(cls)
def getinstance(*args, *kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return getinstance
7.类装饰器装饰函数
class Decorate():
def __init__(self,fun):
self.fun = fun
def __call__(self, *args, **kwargs):
self.fun(*args, **kwargs)
@Decorate
def fun(a,b):
pass
fun(1,2)
8.装饰器装饰类
def decorate(My_cls):
my_cls.name = brook_
return my_cls
@decorate
class My_cls:
pass
print(My_cls.name)
--> brook_
9.实现装饰普通函数与装饰方法的兼容
method_decorator()
def decorator(fun):
def wrapper(*args, **kw):
return fun(*args, **kw)
return wrapper
@decorator
def fun2():
pass
class Test:
@method_decorator(decorator)
def fun3(self):
pass