函数装饰器
普通的装饰器较为简单,关键点只有两个,一个是闭包的概念,一个是函数作为参数进行传递,让我们先实现一个简单的装饰器。
def huat(f):
def func():
print("welcome to huat!")
f()
return func
@huat
def method():
print("hello world!")
if __name__ == '__main__':
# Huat().run()
method()
执行结果如下
welcome to huat!
hello world!
这里的装饰器无需传递参数,将装饰器函数种的闭包函数func
作为一个参数进行返回即可。
方法装饰器
方法装饰器的实现和普通装饰器类似,我们先看一个不传递参数的例子
import time
def printTime(f):
def x(self, *args, **kwargs):
print("%s" % time.strftime("%X"))
f(self, *args, **kwargs)
return None
return x
class Huat:
@printTime
def run(self):
print("this's run.")
if __name__ == '__main__':
Huat().run()
运行结果
15:41:10
this's run.
这里需要注意的地方是,在装饰器函数种的闭包func
中,需要接收一个参数slef
,然后在外部返回这个闭包函数即可。
带参数的方法装饰器
先来看一下代码
import time
def app(method: str):
print(f"调用了{method}方法")
def inner(func):
def in_inner(self):
print("%s" % time.strftime("%X"))
func(self)
return None
return in_inner
return inner
class Huat:
@app(method="get")
def run(self):
print("this's run.")
if __name__ == '__main__':
Huat().run()
运行结果
调用了get方法
16:11:13
this's run.
在装饰器函数有参数的情况下,被修饰的函数通过装饰器函数的闭包参数进行传递了,所以在闭包中的inner
函数可以接收到被修饰函数run
,所以多嵌套了一层闭包函数才能进行正常的装饰操作。