Python装饰器
- 装饰器的功能和实现方法
- 功能:对函数和类功能进行扩展
- 装饰模式有不少经典的使用场景,例如插入日志、性能测试、事务处理等等,有了装饰器,就能够提取大量函数中与自己功能无关的相似代码,从而达到代码重用的目的。
- 实现:装饰器能够是函数,也能够是一个对象,总之是能够将要装饰的函数做为参数传入并返回函数或对象再赋值给函数或类
- 装饰器语法糖:在Python中,可使用”@”语法糖来精简装饰器的代码
- 下面使用不一样的方式实现装饰器来讲明:
def decorator(func):
print(func)
def inner():
print('执行demo函数以前增长一些功能')
func()
print('执行demo函数以后增长一些功能')
return inner
@decorator
def demo():
print('测试装饰器的函数')
return 0
demo()
复制代码
<function demo at 0x000001D3146CE158>
执行demo函数以前增长一些功能
测试装饰器的函数
执行demo函数以后增长一些功能
复制代码
def decorator(func):
print(func)
def inner(var):
print('执行demo函数以前增长一些功能')
res = func(var)
print('执行demo函数以后增长一些功能')
return res
return inner
@decorator
def demo(var):
print('测试装饰器的函数')
return var
test = demo('测试')
print(test)
复制代码
<function demo at 0x000001D3146EE048>
执行demo函数以前增长一些功能
测试装饰器的函数
执行demo函数以后增长一些功能
测试
复制代码
def outer(arg):
def decorator(func):
print(func)
def inner1(var):
print('执行demo函数以前增长一些功能1')
res = func(var)
print('执行demo函数以后增长一些功能1')
return res
def inner2(var):
print('执行demo函数以前增长一些功能2')
res = func(var)
print('执行demo函数以后增长一些功能2')
return res
if arg == 1 :
return inner1
elif arg == 2 :
return inner2
return decorator
@outer(1)
def demo(var):
print('测试装饰器的函数')
return var
test = demo('测试')
print(test)
print('\n###############################################\n')
@outer(2)
def demo(var):
print('测试装饰器的函数')
return var
test = demo('测试')
print(test)
复制代码
<function demo at 0x000001D3146CE840>
执行demo函数以前增长一些功能1
测试装饰器的函数
执行demo函数以后增长一些功能1
测试
###############################################
<function demo at 0x000001D314702B70>
执行demo函数以前增长一些功能2
测试装饰器的函数
执行demo函数以后增长一些功能2
测试
复制代码
class decorator:
def __init__(self,arg):
self.arg = arg
def __call__(self,func):
self.func = func
return self.inner
def inner(self,var):
print('执行demo函数以前增长一些功能2')
res = self.func(var)
print('执行demo函数以后增长一些功能2')
return res
@decorator(1)
def demo(var):
print(var)
return var
res = demo('123')
print(res)
复制代码
执行demo函数以前增长一些功能2
123
执行demo函数以后增长一些功能2
123
复制代码
objs = {}
def decorator(cls):
def inner():
obj = None
if cls in objs:
return objs[cls]
else :
obj = object.__new__(cls)
objs[cls] = obj
return obj
return inner
@decorator
class demo1:
pass
@decorator
class demo2:
pass
t1 = demo1()
t2 = demo1()
print(id(t1),id(t2))
t21 = demo2()
t22 = demo2()
print(id(t21),id(t22))
复制代码
2006092685552 2006092685552
2006092688128 2006092688128
复制代码
def decorator1(func):
def inner():
print('装饰器1')
func()
print('装饰器1')
return inner
def decorator2(func):
def inner():
print('装饰器2')
func()
print('装饰器2')
return inner
@decorator2
@decorator1
def demo():
print('demo函数')
demo()
复制代码
装饰器2
装饰器1
demo函数
装饰器1
装饰器2
复制代码
总结
- 装饰器本质上是一个python函数,它可让其余函数在不作任何代码变更的前提下增长额外的功能,装饰器的返回值也是一个函数对象
- python内置的三个装饰器:staticmethod,classmethod和property
- staticmethod:把类中的方法定义为静态方法,使用staticmethod装饰的方法可使用类或者类的实例对象来调用,不须要传入self
- classmethod:把类中的方法定义为类方法,使用classmethod装饰的方法可使用类或者类的实例对象来调用,并将该class对象隐式的做为第一个参数传入
- property:把方法变成属性
- 三种内置装饰器之后再详述