简单来说,装饰器的作用就是为已经存在的函数或对象添加额外的功能。
先来定义一个简单的函数
def say_hello():
print("hello!")
那么我们现在想实现这样一个功能:打印出这个函数的名称。但是又不能修改这个函数的代码,(遵循了开闭原则),这个时候装饰器就要登场了
def print_name(func):
print("[func_name]: %s ()" % func.__name__)
return func()
这就是一个简单的装饰器,他所具有的功能就是在被他装饰的函数会打印"[fun_name]: %s ()" % func.__name__,
装饰器的使用就是在需要被装饰的函数的上面一行加上@(语法糖),后面是写好的装饰器名称
@print_name
def say_hello():
print("hello!")
say_hello()
==============输出=============
[func_name]: say_hello ()
hello!
下面解决一下装饰有参数的函数的装饰器
先写一个带参数的函数
def say(something):
print("hello {}!".format(something))
当被装饰的函数需要传递参数,装饰器如下
def print_name(func):
def wrapper(something1): # 指定一毛一样的参数
print("[name]: {}()".format(func.__name__))
return func(something1)
return wrapper # 返回包装过函数
装饰器效果如下
@print_name
def say(something):
print("hello {}!".format(something))
say("wuhan fighting!!")
================输出==============
[name]: say()
hello wuhan fighting!
再进一步,装饰器需要传参呢
# ============带参数的装饰器==============
# 这层传入装饰器的参数
def logging(level):
# 这层传入要装饰的函数
def wrapper(func):
# 这层传入要装饰的函数的参数
def inner_wrapper(*args, **kwargs):
print("[{level}]: enter function {func}()".format(
level=level,
func=func.__name__))
return func(*args, **kwargs)
return inner_wrapper
return wrapper
看效果
@logging(level='INFO')
def say(something):
print("say {}!".format(something))
say('武汉加油!!')
================输出==================
[INFO]: enter function say()
say 武汉加油!!!
武汉加油!!中国加油!!!