自学Python4.2-装饰器

自学Python之路-Python基础+模块+面向对象
自学Python之路-Python网络编程
自学Python之路-Python并发编程+数据库+前端
自学Python之路-django

自学Python4.2 - 装饰器

time.time()         # 获取当前时间
time.sleep(10)      #让程序在执行到这个位置的时候停10s

1.简单列子:  计算一段代码的执行时间

代码1:

import  time
print(time.time())
def func():  # 被装饰的函数
    start = time.time()  # 获取开始的时间
    print('我好喜欢大家啊 ~~')  # 测试时间的代码
    end = time.time()
    print(end-start)
func()

自学Python4.2-装饰器_第1张图片

代码2:
由于执行代码的速度太快,没有体现出来结果,这是可以使用 time.sleep(10)  加大代码执行的时间。

import  time
print(time.time())
def func():  # 被装饰的函数
    start = time.time()  # 获取开始的时间
    print('我好喜欢大家啊 ~~')  # 测试时间的代码
    time.sleep(0.01)
    end = time.time()
    print(end-start)
func()

自学Python4.2-装饰器_第2张图片

代码3: 

为了让函数func()完全分离出来,现在定义一个新函数timmer(),主要用于计算函数的执行时间(开始的时间,结束时间,执行的函数)

import  time
print(time.time())
def func():  # 被装饰的函数
    time.sleep(0.01)
    print('我好喜欢大家啊 ~~')  # 测试时间的代码
def timmer(func): #装饰函数
    start = time.time()  # 获取开始的时间
    func()
    end = time.time()
    print(end-start)

timmer(func)  #执行timmer,而且是执行参数func的函数 

自学Python4.2-装饰器_第3张图片

代码4:  装饰器

其实上面的例子,真正环境下是存在问题的。     应该最终调用func(), 最好调用func()时候实质是调用timmer()

  • 装饰器的作用:不想修改函数的调用方式,但是还想再原来的函数前后添加功能
  • 装饰器的开发原则:开放封闭原则
  • 装饰器的本质:闭包函数
  • 以上例子timmer就是一个装饰器函数,只是对一个函数有一些装饰作用

函数的闭包定义:

    在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包。

 自学Python4.2-装饰器_第4张图片

装饰器本质上就是一个python闭包函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象。

  装饰器的应用场景:比如插入日志,性能测试,事务处理,缓存等等场景。

import  time
print(time.time())
def func():
    time.sleep(0.01)
    print('我好喜欢大家啊 ~~')

def timmer(f):    #装饰器函数
    def inner():
        start = time.time()
        f()   #被装饰的函数
        end = time.time()
        print(end - start)
    return inner
func = timmer(func)
func() # 其实执行的是inner()

自学Python4.2-装饰器_第5张图片

自学Python4.2-装饰器_第6张图片

2.编码原则: 开放封闭原则

  • 开放:对扩展是开放的
  • 封闭:对修改是封闭的(封板)

3.装饰器---语法糖

import  time
print(time.time())

def timmer(f):    #装饰器函数
    def inner():
        start = time.time()
        f()
        end = time.time()
        print(end - start)
    return inner
@timmer  #语法糖  @装饰器的函数 ,相当于func = timmer(func)
def func(): #被装饰的函数
    time.sleep(0.01)
    print('我好喜欢大家啊 ~~')

func()

自学Python4.2-装饰器_第7张图片

 

你可能感兴趣的:(自学Python4.2-装饰器)