Python--关于装饰器,最基础的理解(不包括闭包。。递归。。)

简单来说,装饰器的作用就是为已经存在的函数或对象添加额外的功能。

先来定义一个简单的函数

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 武汉加油!!!

武汉加油!!中国加油!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章