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))

转载于:https://www.cnblogs.com/fangshiqi/p/6408223.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值