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