Python - 函数装饰器(一)

1.什么叫函数装饰器?

    装饰器(Decorators)是 Python 的一个重要部分。

    简单地说:他们是修改其他函数的功能的函数,他们有助于让我们的代码更简短,更有范!

    也可以说是:为了增加功能而对函数或者类进行功能扩充的一种语法。就像女孩化妆一样,女孩还是那个女孩,但是化妆过后更加漂亮了~

2.用代码来描述:

    首先我们声明一个基本函数,然后调用函数:

# 声明一个基本函数
def test1():
    print('我是一个基本函数')
    
# 调用函数
test1()

    运行后会输出: 我是一个基本函数

    我们需要在这个基本函数的输出前后添加一些功能:

# 声明一个基本函数
def test():
    print('我是一个基本函数')


# 定义一个给test函数增加功能的函数
def func2(func):
    # 增加功能一
    print('我是增加的功能一')
    # 调用基本功能,这里如果需要调用基本功能,我们需要把基本函数作为参数传递给func2
    func()          # 相当于调用test函数
    # 增加功能二
    print('我是增加的功能二')


# 将基本函数作为参数传递给func2,并且调用func2
func2(test)

    运行后会输出: 我是增加的功能一

            我是一个基本函数

            我是增加的功能二

    但是,这样我们是运行的增加功能的函数,并非我们最开始的基本函数test,因此我们需要在func2函数里再定义一个函数,把tset函数传递进去,然后返回定义的这个函数;

    说着可能有点迷糊,我们看一下代码就懂了

# 声明一个基本函数
def test():
    print('我是一个基本函数')


# 定义一个给test函数增加功能的函数
def func2(func):
    def infunc():
        # 增加功能一
        print('我是增加的功能一')
        # 调用基本功能,这里如果需要调用基本功能,我们需要把基本函数作为参数传递给func2
        func()          # 相当于调用test函数
        # 增加功能二
        print('我是增加的功能二')
    # 这里infunc不能加(),加()后就会变成调用infunc函数
    # 返回一个函数,这里返回的函数就是我们未来添加好功能的函数,即具备基本函数也具备增加功能的函数
    return infunc


# 装饰操作
test = func2(test)
# 调用装饰后的test函数
test()

    运行结果:我是增加的功能一

         我是一个基本函数

         我是增加的功能二

    这就是我们想要的功能呀!这也就装饰器的原理,但是我们需要用装饰器的语法来写;

    这里可能有人没看懂    装饰操作 :test = func2(test)   这里func2(test)的返回值返回的是函数infunc,类似下面的代码,可以自己运行下:

def test():
    print('hello,python')


func = test
func()

    用装饰器语法来写上面的函数:

# 定义一个给test函数增加功能的函数
def func2(func):
    def infunc():
        # 增加功能一
        print('我是增加的功能一')
        # 调用基本功能,这里如果需要调用基本功能,我们需要把基本函数作为参数传递给func2
        func()  # 相当于调用test函数
        # 增加功能二
        print('我是增加的功能二')

    # 这里infunc不能加(),加()后就会变成调用infunc函数
    # 返回一个函数,这里返回的函数就是我们未来添加好功能的函数,即具备基本函数也具备增加功能的函数
    return infunc


# 装饰操作
@func2  # 等价于test = func2(test)
# 声明一个基本函数
def test():
    print('我是一个基本函数')


# 调用装饰后的test函数
test()   

    运行结果:我是增加的功能一

         我是一个基本函数

         我是增加的功能二

猜你喜欢

转载自www.cnblogs.com/cxstudypython/p/12142951.html