Python装饰器本质上是一个Python 函数或类,它可以让其他函数或类在不需要做任何代码修改的前提下增加额外功能,装饰器的返回值也是一个函数/类对象。 它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。
python装饰器的4种类型:
1.函数装饰函数(最常用)
2.函数装饰类
3.类装饰函数
4.类装饰类
装饰器触发时刻:被装饰者被调但未调用时会立即触发装饰器 函数(类)
Python装饰器的写法核心和注意事项:
装饰器中的装饰函数返回的一定是函数对象,而非函数调用
几种装饰器的写法Demo
1.函数装饰函数
def wrapF(originalFunction):
def newFunction(*args, **kwargs):
result = originalFunction(*args, **kwargs)
return result
return newFunction
@wrapF
def Bar(a):
return a
# print(Bar('xiemanR'))
2.函数装饰类
def wrapClass(cls):
def inner(*args,**kwargs):
print('class name:', cls.__name__)
return cls(*args,**kwargs)
return inner
@wrapClass
class Foo():
def __init__(self, a):
self.a = a
def fun(self):
print('self.a =', self.a)
m = Foo('xiemanR')
m.fun()
3.类装饰函数
class ShowFunName():
def __init__(self, func):
self._func = func
def __call__(self, *args,**kwargs):
print('function name:', self._func.__name__)
return self._func(*args,**kwargs)
@ShowFunName
def Bar(a):
return a
print(Bar('xiemanR'))
3.类装饰类
class ShowClassName(object):
def __init__(self, cls):
self._cls = cls
def __call__(self, *args,**kwargs):
print('class name:', self._cls.__name__)
return self._cls(*args,**kwargs)
@ShowClassName
class Foobar(object):
def __init__(self, a):
self.value = a
def fun(self):
print(self.value)
a = Foobar('xiemanR')
a.fun()
我在重构web项目的时候,使用Python装饰器实现了一个服务层级事务控制器,可以出门右转看一下,帮助一下理解,地址: