假如我有一个函数,作用是打印从start开始到end为止每一个数
def count(start, end):
for i in range(start, end+1):
print(i)
现在我想用装饰器在函数count执行前显示“报数开始”,结束后显示“报数结束”
def mydecorator(func):
def warpper(*args, **kwargs):
print("---报数开始---")
func(*args, **kwargs)
print("---报数结束---")
return warpper
@mydecorator
def count(start, end):
for i in range(start, end+1):
print(i)
count(start=0, end=10)
和下面这种写法有什么区别,优缺点是什么?
def deal(func, *args, **kwargs):
print("---报数开始---")
func(*args, **kwargs)
print("---报数结束---")
def count(start, end):
for i in range(start, end+1):
print(i)
deal(count, start=0, end=10)
装饰器的实现就是下面的代码
装饰器的好处就是面向对象
你用deal包装一下count,首先调用起来麻烦,可读性也比较差
而且一旦你想改回直接调用count,那要删掉一行代码再重新添加一行代码,万一要来回改那就很麻烦
用装饰器你所有调用count的地方都是直接调用,不需要装饰器了那直接删掉装饰器,所有调用count的地方就统一的不再出现文字