python中的装饰器语法糖

假如我有一个函数,作用是打印从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的地方就统一的不再出现文字