Python 函数修饰符(装饰器)的使用

 Python 函数修饰符(装饰器)的使用

1.  修饰符的来源
修饰符是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。
修饰符是解决这类问题的绝佳设计,有了修饰符,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,修饰符的作用就是为已经存在的对象添加额外的功能。

如下:

  1. import time
  2.  
  3. def timeslong(func):
  4.     start = time.clock()
  5.     print("It's time starting ! ")
  6.     func()
  7.     print("It's time ending ! ")
  8.     end = time.clock()
  9.     return "It's used : %s ." % (end - start).  

上面的程序中,定义了一个函数,对另外一个对象的运行时间进行计算,如果采用通常的方式需要将 func() 重新在 timeslong 中重新写一遍。为了简化这种操作,便提出了修饰符的概念。

如下:

  1. import time
  2.  
  3. def timeslong(func):
  4.     def call():
  5.         start = time.clock()
  6.         print("It's time starting ! ")
  7.         func()
  8.         print("It's time ending ! ")
  9.         end = time.clock()
  10. 10.   return "It's used : %s ." % (end - start)
  11.     return call 

13. @timeslong

14. def f():

  1. 15.     y = 0
  2. 16.     for i in range(10):
  3. 17.         y = y + i + 1
  4. 18.         print(y)
  5. 19.     return y 

21. print(f())

这样出现便不用再函数内部再进行嵌入函数,通过 @timeslong 对其进行修饰达到目的,是整个代码美观,而且少些部分代码

修饰符也可以通过类来进行使用,共享该类,如下为一个实例:

  1. class timeslong(object):
  2. def __init__(self,func):
  3.     self.f = func
  4. def __call__(self):
  5.     start = time.clock()
  6.     print("It's time starting ! ")
  7.     self.f()
  8.     print("It's time ending ! ")
  9.     end = time.clock()
  10.     return "It's used : %s ." % (end - start) 

12. @timeslong

13. def f():

  1. 14.     y = 0
  2. 15.     for i in range(10):
  3. 16.         y = y + i + 1
  4. 17.         print(y)
  5. 18.     return y  

20. print(f())

2.  Python内置的修饰符

内置的修饰符有三个,分别是 staticmethod、classmethod 和 property,作用分别是把类中定义的实例方法变成静态方法、类方法和类属性。由于模块里可以定义函数,所以静态方法和类方法的用处并不是太多。

  1. class Hello(object):
  2.     def __init__:
  3.         ...
  4.  
  5. @classmethod
  6. def print_hello(cls):
  7.     print("Hello")
  8.  

classmethod 修饰过后,print_hello() 就变成了类方法,可以直接通过 Hello.print_hello() 调用,而无需绑定实例对象了。

posted @ 2018-11-30 01:18  The-Chosen-One  阅读(708)  评论(0编辑  收藏  举报