[关闭]
@chengweihuang 2019-04-19T01:50:35.000000Z 字数 2025 阅读 471

装饰器

每日总结


装饰器

装饰器实际上就是为了给某程序增添功能,但该程序已经上线或已经被使用,那么就不能大批量的修改源代码,这样是不科学的也是不现实的,因为就产生了装饰器.

  1. import time
  2. def test():
  3. time.sleep(2)
  4. print("test is running!")
  5. test()

高阶函数

  1. 把一个函数名当作实参传给另外一个函数(“实参高阶函数”)
  2. 返回值中包含函数名(“返回值高阶函数”)
  1. import time
  2. def test():
  3. time.sleep(2)
  4. print("test is running!")
  5. def deco(func):
  6. start = time.time()
  7. func() #2
  8. stop = time.time()
  9. print(stop-start)
  10. deco(test)

我们看到似乎是达到了需求,即执行了源程序,同时也附加了计时功能,但是这只满足了一个要求(不能修改被装饰的函数的源代码)
但这修改了调用方式。假设不修改调用方式,那么在这样的程序中,被装饰函数就无法传递到另一个装饰函数中去。

  1. import time
  2. def test():
  3. time.sleep(2)
  4. print("test is running!")
  5. def deco(func):
  6. print(func)
  7. return func
  8. t = deco(test)
  9. test()

嵌套函数

  1. def func1():
  2. def func2():
  3. pass
  4. def func1():
  5. func2()

嵌套函数指的是在函数内部定义一个函数,而不是调用
函数只能调用和它同级别以及上级的变量或函数。也就是说:里面的能调用和它缩进一样的和他外部的,而内部的是无法调用的。

  1. import time
  2. def timer(func) :
  3. def deco():
  4. start = time.time()
  5. func()
  6. stop = time.time()
  7. print(stop-start)
  8. return deco
  9. def test():
  10. time.sleep(2)
  11. print("test is running!")
  12. goo = timer(test)
  13. goo()

实现了装饰器的作用

把函数看成是盒子,test是小盒子,deco是中盒子,timer是大盒子。程序中,把小盒子test传递到大盒子temer中的中盒子deco,然后再把中盒子deco拿出来,打开看看(调用)

每次都需要 goo = timer(test) 太麻烦

  1. import time
  2. def timer(func):
  3. def deco():
  4. start = time.time()
  5. func()
  6. stop = time.time()
  7. print(stop-start)
  8. return deco
  9. @timer
  10. def test():
  11. time.sleep(2)
  12. print("test is running!")
  13. test()

通过闭包 , 将被装饰的函数 放到装饰器里面 ,来实现 不改变函数 ,也不改变函数的调用. 使函数增加新的功能

有参数的时候 怎么处理

  1. import time
  2. def timer(func):
  3. def deco(*args, **kwargs):
  4. start = time.time()
  5. func(*args, **kwargs)
  6. stop = time.time()
  7. print(stop-start)
  8. return deco
  9. @timer
  10. def test(parameter):
  11. print("test is running!",parameter)
  12. test(1)

有返回值得时候

  1. import time
  2. def timer(func):
  3. def deco(*args, **kwargs):
  4. start = time.time()
  5. result = func(*args, **kwargs)
  6. stop = time.time()
  7. print(stop-start)
  8. return result
  9. return deco
  10. @timer
  11. def test(parameter):
  12. print("test is running!",parameter)
  13. return 666
  14. over = test(1)
  15. print(over)

装饰器有参数的时候

  1. import time
  2. def timer(name):
  3. def time2r(func):
  4. def deco(*args, **kwargs):
  5. start = time.time()
  6. result = func(*args, **kwargs)
  7. stop = time.time()
  8. print(name,stop - start)
  9. return result
  10. return deco
  11. return time2r
  12. @timer('test1')
  13. def test1(parameter):
  14. print("test is running!", parameter)
  15. return 666
  16. @timer('test2')
  17. def test2(parameter):
  18. print("test is running!", parameter)
  19. return 999
  20. over = test1(1)
  21. over2 = test2(2)
  22. print(over)
  23. print(over2)
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注