python装饰器入门篇

71 阅读2分钟

python中的函数

在python中,函数是一等公民,不像Java一样【不弄个类出来,根本没有办法运行代码】。

把函数func 赋予了变量 send_message,调用 send_message,就相当于是调用函数 func()

def func(message):
    print('Got a message: {}'.format(message))
    
send_message = func
send_message('hello world')

# 输出
Got a message: hello world

下面这个,相当于把函数作为变量传入另一个函数,即函数的嵌套。


def get_message(message):
    return 'Got a message: ' + message


def root_call(func, message):
    print(func(message))
    
root_call(get_message, 'hello world')

# 输出
Got a message: hello world

同样的,函数的定义,也可以在一个函数的内部。


def func(message):
    def get_message(message):
        print('Got a message: {}'.format(message))
    return get_message(message)

func('hello world')

# 输出
Got a message: hello world

继续的,如果返回值是一个函数对象,而不是执行后的结果。


def func_closure():
    def get_message(message):
        print('Got a message: {}'.format(message))
    return get_message

send_message = func_closure()
send_message('hello world')

# 输出
Got a message: hello world

无参装饰器

其实,上面已经很接近装饰器了

装饰器:

我们本来简单的函数是打印hello world,现在希望给这个函数增加点东西,但是又不修改这个函数内容,那么可以按照下面的方式去做。 变量 my_greet 指向了内部函数 wrapper(),而内部函数 wrapper() 中又会调用原函数 greet(),因此,最后调用 my_greet() 时,就会先打印'wrapper of decorator',然后输出'hello world'。

这里的函数 my_decorator() 就是一个装饰器,它把真正需要执行的函数 greet() 包裹在其中,并且改变了它的行为,但是原函数 greet() 不变。

def my_decorator(func):
    def wrapper():
        print('wrapper of decorator')
        func()
    return wrapper

def greet():
    print('hello world')

my_greet = my_decorator(greet)
my_greet()

# 输出
wrapper of decorator
hello world

在python中,使用这个有更优雅的办法,就是使用语法糖。

def my_decorator(func):
    def wrapper():
        print('wrapper of decorator')
        func()
    return wrapper

@my_decorator
def greet():
    print('hello world')

greet()

python的装饰器的应用场景和AOP类似,把一些常用的业务逻辑分离,提高程序可重用性,降低耦合度,提高开发效率。

此文章为3月Day2学习笔记,内容来源于极客时间《17 | 强大的装饰器 (geekbang.org)