装饰器基础

小知识:

1,time模块

import time

time.sleep(5)         #5秒内什么都不干

print('等了你5秒')

time.time()是从1970年到现在过的秒数。

import time:

a = time.time()

...

b = time.time()

a - b 就是中间...执行的时间秒数。

装饰器的标准用法:

 

上面是一个在常用函数中增加程序运行计时功能的案例。使用了闭包的方法。多理解一下。

这时,timmer就是一个装饰器。

def timmer(f):            #装饰器的名称

  def inner(a):          

    start = time.time()

    ret = f(a)            #装饰了这个函数。如果需要在被装饰函数中增加返回值,前面必须有一个ret 去接受f()的返回值

    end  = time.time()

    print(end - start)

    return ret          #为了在被装饰函数中增加返回值,在这里将f()的返回值返回给time(f)

  return inner          #返回了闭包的结果。注意一定不能加括号,不然就不能返回inner的内存地址了。

@timmer

def func(a):

  time.sleep(0.01)

  print(‘老板好,同事好,大家好’)

  return '新年好'

#func = timmer(func)    #同上面的@timmer

func()

一,装饰器的开放封闭原则:

  开放:对拓展是开放的(可以对函数和功能进行拓展,而不修改源代码)

  封闭:对修改是封闭的(不能直接修改已经写好了的代码)

  意义:维护代码的稳定性,在大公司中团体编程的时候非常重要。

  使用装饰器就可以做到不修改原本功能的情况下,还可以给函数添加功能。

       而且还不影响原来函数的名字。

二,装饰器书写的模式:

  上述代码def func()处可以市容如下写法的简写:(但是记得先把装饰器写在需要定义的函数上面。)

    @timmer    #@装饰器函数名

    def func()

三,装饰器的进阶设置:

 注意以上操作在原有基础上增加了函数func(a,b)的传入多个位置参数和多个默认参数的功能,并且能将函数func(a)的返回结果正常传出来。

上面这个图多去记忆,以后写装饰器的时候只需要自己规定func功能,并且在装饰器固定位置增加装饰器功能就可以了。运用自如。

以前我有写好的atm程序,但是没有增加数据库的读写功能的,在这里应该就可以用到这个装饰器了,不用每个函数都去添加固定的功能了,

避免了不稳定性,并且也很节约时间。虽然新写的程序暂时还用不到,但是未来总会有一天会用到这个东西的。

四 装饰器的固定模式:

def $装饰器的名称(f):

  def inner(*args,**kwargs):

    ret = f(*args,**kwargs)

    return ret

  return inner

@ $装饰器的名称

def $被装饰的函数名(#可以包含任意数量任意类型的形参):

  ...

  return ...  #可以返还,也可以不返还

#也可以这样写: 

func = $装饰器的名称(func)

ret = func(#形参)

  

 

原文地址:https://www.cnblogs.com/wanghanyao/p/10177260.html