Python_day4_装饰器

一.装饰器

1.什么是装饰器.

  装饰器即函数

  装饰即修饰,意指为其他函数添加新功能

  装饰器定义:本质就是函数,功能是为其他函数添加新功能

 

2.装饰器需要遵循的原则.

  1.不修改被装饰函数的源代码(开放封闭原则)

  2.为被装饰函数添加新功能后,不修改被修饰函数的调用方式

 

3.装饰器的实现本质.

  装饰器=高阶函数+函数嵌套+闭包

 

4.高阶函数

  高阶函数定义:
  1.函数接收的参数是一个函数名

  2.函数的返回值是一个函数名

  3.满足上述条件任意一个,都可称之为高阶函数

  高阶函数示范:

  def foo():
      print('我的函数名作为参数传给高阶函数')
  def gao_jie1(func):
      print('我就是高阶函数1,我接收的参数名是%s' %func)
      func()

  def gao_jie2(func):
      print('我就是高阶函数2,我的返回值是%s' %func)
      return func
  
  gao_jie1(foo)
  gao_jie2(foo)

   把函数当做参数传给高阶函数

  #高阶函数应用1:把函数当做参数传给高阶函数
  import time
  def foo():
      print('from the foo')
  
  def timmer(func):
      start_time=time.time()
      func()
      stop_time=time.time()
      print('函数%s 运行时间是%s' %(func,stop_time-start_time))
  timmer(foo)
  #总结:我们确实为函数foo增加了foo运行时间的功能,但是foo原来的执行方式是foo(),
     现在我们需要调用高阶函数timmer(foo),改变了函数的调用方式

   函数返回值是函数名:

  #高阶函数应用2:把函数名当做参数传给高阶函数,高阶函数直接返回函数名
  import time
  def foo():
      print('from the foo')

  def timmer(func):
      start_time=time.time()
      return func
      stop_time=time.time()
      print('函数%s 运行时间是%s' %(func,stop_time-start_time))
  foo=timmer(foo)
  foo()
  #总结:我们确实没有改变foo的调用方式,但是我们也没有为foo增加任何新功能

   高阶函数总结
  1.函数接收的参数是一个函数名
    作用:在不修改函数源代码的前提下,为函数添加新功能,
    不足:会改变函数的调用方式
  2.函数的返回值是一个函数名
    作用:不修改函数的调用方式
    不足:不能添加新功能

5.嵌套函数

 def father(name):
      print('from father %s' %name)
      def son():
          print('from son')
          def grandson():
              print('from grandson')
          grandson()
      son()
  
 father('fangshiqi')

6.闭包

闭包:在一个作用域里放入定义变量,相当于打了一个包

  def father(name):
      def son():
          # name='alex'
          print('我爸爸是 [%s]' %name)
          def grandson():
              # name='wupeiqi'
             print('我爷爷是 [%s]' %name)
         grandson()
     son()
 
  father('fangshiqi')

 7.无参装饰器

  无参装饰器=高级函数+函数嵌套

  基本框架

  #这就是一个实现一个装饰器最基本的架子
  def timer(func):
      def wrapper():
           func()
      return wrapper

  加上参数

   def timer(func):
       def wrapper(*args,**kwargs):
           func(*args,**kwargs)
       return wrapper

  加上功能 

   import time
   def timer(func):
       def wrapper(*args,**kwargs):
           start_time=time.time()
           func(*args,**kwargs)
           stop_time=time.time()
           print('函数[%s],运行时间是[%s]' %(func,stop_time-start_time))
       return wrapper

  使用装饰器

   def cal(array):
       res=0
       for i in array:
           res+=i
       return res
 
   cal=timer(cal)
   cal(range(10))
   @timer  #@timer就等同于cal=timer(cal)
   def cal(array):
       res=0
       for i in array:
           res+=i
       return res
 
   cal(range(10))
posted @ 2017-02-17 08:31  诉说丶  阅读(137)  评论(0编辑  收藏  举报