小伙伴们建议做一个装饰器的通用总结
前面两篇文章总结了,函数和类方式实现装饰器及原理,本篇文章不介绍原理,直接展示通用装饰器模板,可以复制后直接使用。
如果想看总结很清晰的装饰原理,点击【高阶函数、闭包、装饰器】和【装饰器类的实现方式】
下面用装饰类的形式总体介绍模板,当然这四种通用模板不止可以装饰类,还可以装饰函数和方法
最后一种方式(第五种方式),只能装饰方法
第一种方式:函数方式(通用装饰器,不带参数)
def outer(
fun): def
inner
(*args, **kwargs): print(
"实例化类前") result =
fun
(*args, **kwargs) print(
"实例化类后")
return result
return
inner@outer # 装饰器使用
class
A:
def __init__(self, a): print(
"实例化类{}".format(a))A(
1)# 结果:
""
"实例化类前实例化类1实例化类后"
""
第二种方式:函数方式(通用装饰器,带参数)def outer2(arg): def outer(
fun): def
inner
(*args, **kwargs): print(
"使用参数{}".format(arg)) print(
"实例化类前") result =
fun
(*args, **kwargs) print(
"实例化类后")
return result
return
inner
return
outer@outer2(
1) # 装饰器使用
class
A:
def __init__(self, a): print(
"实例化类{}".format(a))A(
2)# 结果:
""
"使用参数1实例化类前实例化类2实例化类后"
""
第三种方式:类方式(通用装饰器,不带参数)
class
Outer:
def __init__(self,
fun): # 函数名作为参数 self.
fun =
fun def
__call__
(self, *args, **kwargs): #
1、__call__自动调用和返回内部函数 print(
"实例化类前") result = self
.
fun
(*args, **kwargs) #
2、内部函数引用外部函数变量 print(
"实例化类后")
return
result@Outer # 装饰器使用
class
A:
def __init__(self, a): print(
"实例化类{}".format(a))A(
1)# 结果:
""
"实例化类前实例化类1实例化类后"
""
第四种方式:类方式(通用装饰器,带参数)class
Outer:
def __init__(self, arg): # 定义装饰器参数 self.arg = arg def __call__(self,
fun): # 函数名作为参数 def
inner
(*args, **kwargs): #
1、嵌套函数(在函数中定义另一个函数) print(self.arg) result =
fun
(*args, **kwargs) #
2、内部函数引用外部函数变量
return result
return
inner #
3、外部函数返回内部函数
@Outer(
"装饰器参数") # 装饰器使用
class
A:
def __init__(self, a): print(
"实例化类{}".format(a))A(
1)# 结果:
""
"装饰器参数实例化类1"
""
第五种方式:类方式(只能装饰方法,不带参数)
class
Outer:
def __init__(self,
fun): self.
fun =
fun def
__get__
(self, instance, owner): def
inner(*args, **kwargs): print(
"执行函数前") result = self
.
fun
(instance, *args, **kwargs) print(
"执行函数后")
return result
return innerclass A:
@Outer def func(self, a):
return aa = A()print(a.func(
3))# 返回:
""
"执行函数前执行函数后3"
""