python基础:装饰器

时间:2022-02-24 18:39:55

一、定义:

        是一个传入值是函数,返回值也是函数的高阶函数。


二、作用:

        不改变原函数的代码和调用方式,增加新的功能。


三、实例:

            把两个函数earth()和moon()添加print('They are in the solar system!')

            1、定义两个函数,分别有自己的功能:

def earth(): print('This is earth!')
 
def moon():
 print('This is moon!')

earth()
moon()

            运行结果:

This is earth!This is moon!

            2、在不改变当前函数代码,和调用方式情况下,加一个打印太阳系的功能。

def add_func(func):                      # func是一个函数体,func()是运行函数  def solar():  print('It is in the solar system!')  func() return solar                            # 返回solar函数,earth = solar@add_func                                # 此句功能func = earthdef earth(): print('This is earth!') @add_funcdef moon(): print('This is moon!')earth()moon()

        运行结果:

It is in the solar system!This is earth!It is in the solar system!This is moon!

        每次调用earth()和moon(),都会增加打印It is in the solar system!这句。

原理:

        和交换a,b值原理是一样的,首先,把earth函数地址保存到func,再把solar的地址保存到earth,这时候然后再调用earth,实际运行的是solar,再在solar里调用func,实现原来的功能。

        函数,例如earth(),不带括号,可以理解成变量名;     带括号,运行函数,返回函数运行结果。


        3、如果原函数带参数,最里面的func()也需要带参数。

name = 'earth'def add_func(func): def solar():  print('It is in the solar system!')  func(name)                            # 带参数!!!!!!! print('1:',solar) return solar@add_funcdef earth(name):                        # 带参数!!!!!!! print('This is %s!' % name)print('2:',earth)earth()

        如果多个函数使用同一个装饰器,并且这些函数参数的数量不同,func()可以使用变长形式func(*args, **kwargs)

        

本文出自 “回首已是空” 博客,请务必保留此出处http://yishi.blog.51cto.com/1059986/1983475