10-Python之路---装饰器

Posted mark-wq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了10-Python之路---装饰器相关的知识,希望对你有一定的参考价值。

?? Python之路---装饰器??

程序员三大美德:

  1. 懒惰

因为一直致力于减少工作的总工作量。

  1. 缺乏耐性

因为一旦让你去做本该计算机完成的事,你将会怒不可遏。

  1. 傲慢

因为被荣誉感冲晕头的你会把程序写得让谁都挑不出毛病来。

大家好??, 现在让我们一起来学习一下装饰器函数 ??

?? 楔子

你作为一个会写函数的Python开发,今天要去公司上班了,上班第一天写了一个函数,也交给同事去使用了:

def func1():
    print(‘in func1‘)

突然,领导提议对这段日子所有人的开发成果进行审核,审核标准是什么呢?就是统计每个函数的执行时间

这个时候你应该怎么做呢?---改函数

import time


def func1():
    start = time.time()
    print(‘in func1‘)
    print(time.time() - start)

func1()

但是你写了不知道多少函数,一个一个改,很明显不符合程序员的美德,领导审核完,还要挨个删掉,是不是很闹心?

你觉得不行,不能让自己费劲儿,干脆把计时的功能封装成一个函数,于是:

import time


def timer(func):
    start = time.time()
    func()
    print(time.time() - start)
    
    
def func1():
    print(‘in func1‘)


def func2():
    print(‘in func2‘)

    
timer(func1)
timer(func2)

现在我们可以调用这个函数来计算函数的执行时间,但还是改变了函数的调用方式,也就是说我们需要一个不对源码做任何修改,并且可以很好的实现你所有需求的手段,那就是我们要介绍的装饰器了。

装饰器

? 装饰器的本质:一个闭包函数

  装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展

import time


def timer(func):
    def inner():
        start = time.time()
        func()
        print(time.time() - start)
    return inner


def func1():
    print(‘in func1‘)

    
func1 = timer(func1)
func1()

python装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象(函数的指针)。装饰器函数的外部函数传入我要装饰的函数名字,返回经过修饰后函数的名字;内层函数(闭包)负责修饰被修饰函数。

当然比较碍眼的地方就是func1 = timer(func1)这行代码,所以Python的开发者提供了一句语法糖来解决这个问题!

import time


def timer(func):
    def inner():
        start = time.time()
        func()
        print(time.time() - start)
    return inner


@timer   #==> func1 = timer(func1)
def func1():
    print(‘in func1‘)


func1()

带参数的装饰器:

def timer(func):
    def inner(a):
        start = time.time()
        func(a)
        print(time.time() - start)
    return inner

@timer
def func1(a):
    print(a)

func1(1)

应用场景

  • 插入日志
  • 性能测试
  • 事务处理
  • 权限校验
  • ......

PS:开放封闭原则

1.对扩展是开放的

    为什么要对扩展开放呢?

    我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。

2.对修改是封闭的

    为什么要对修改封闭呢?

    就像我们刚刚提到的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户。

而装饰器完美的遵循了这个开放封闭原则。

以上是关于10-Python之路---装饰器的主要内容,如果未能解决你的问题,请参考以下文章

python之路---15 装饰器

python之路-11-装饰器

Python之路第七篇:Python装饰器

python使用上下文对代码片段进行计时,非装饰器

Python之路-装饰器

Python学习之路6 - 装饰器