python深入之装饰器--通过选择发说说和发图片的案例理解装饰器

装饰器即在不对一个函数体进行任何修改,以及不改变整体的原本意思的情况下,增加函数功能的新函数,因为这个新函数对旧函数进行了装饰,所以称为装饰器。装饰器的主要依据是闭包

这里用一个案例来说明装饰器的作用:

(1)客户需要写一个通过选择不同按钮来实现发说说和发图片操作的程序,基本框架如下:

# 函数功能
# 发说说函数
def fss():
    print("发说说")
# 发图片函数
def ftp():
    print("发图片")

# 业务执行代码
buttom = 2
if buttom == 1:
    fss()
else:
    ftp()

(2)这个时候,客户发来需求说在发说说或发图片之前要用户登录,则在框架中要加入用户登录功能。而在对业务代码进行修改时有三个需要遵循的规则:1.不要随意在业务执行代码中修改代码,因为代码的应用场景很多,如果在业务执行代码中修改代码,那么每个场景中都要进行修改,工作量大;2.写好的函数功能不要随意增删,这样会违背“单一职责”原则,即一个函数只实现一个功能;3.不要随意增加新的函数,这样会导致要在业务执行代码中写入该函数,违背第一条规则。根据以上三条规则,将上述代码修改如下:

# 函数功能
# 装饰器
def checkLogin(func):
    def inner():
        print("请登录...")
        func()
    return inner
# 发说说函数
def fss():
    print("发说说")
fss = checkLogin(fss)
# 发图片函数
def ftp():
    print("发图片")
ftp = checkLogin(ftp)
# 业务执行代码
buttom = 2
if buttom == 1:
    fss()
else:
    ftp()

即加入装饰器,其中利用函数名和变量名性质相同,将装饰器返回的函数重新赋值给相应的函数名,从而避免修改业务执行代码

(3)python给出一种装饰器的简化形式,即语法糖。这里装饰器的语法糖即@装饰器名,并放在要装饰的函数前即可,最终代码如下:

# 函数功能
# 装饰器
def checkLogin(func):
    def inner():
        print("请登录...")
        func()
    return inner
# 发说说函数
@checkLogin
def fss():
    print("发说说")
# 发图片函数
@checkLogin
def ftp():
    print("发图片")
# 业务执行代码
buttom = 2
if buttom == 1:
    fss()
else:
    ftp()

这里需要注意的是,使用语法糖后,装饰器的代码会在被装饰函数之前执行,这是装饰器的执行时间问题

猜你喜欢

转载自blog.csdn.net/zx870121209/article/details/81159261