编程语言
首页 > 编程语言> > python函数装饰器

python函数装饰器

作者:互联网

注:读本文章前请先了解闭包或者读作者的python闭包附上链接python闭包

python 函数装饰器

函数装饰器 decorators

函数装饰器的应用 :

需求:在两个方法实现的功能基础上,增加新功能(打印方法名称)


def say_hello():
    print("hello")


def say_goodbye():
    print("goodbye")


say_hello()
say_goodbye()
# 输出
'''
hello
goodbye
'''

方案1

缺点:代码重复.
解决:提取打印方法名称的功能


def say_hello():
    print(say_hello.__name__)
    print("hello")


def say_goodbye():
    print(say_goodbye.__name__)
    print("goodbye")


say_hello()
say_goodbye()
# 输出
'''
say_hello
hello
say_goodbye
goodbye
'''

方案2

缺点:在两个已有功能的内部,增加新功能,代码可读性差.

def print_func_name(func):
    print(func.__name__)


def say_hello():
    # print(say_hello.__name__)
    print_func_name(say_hello)
    print("hello")


def say_goodbye():
    # print(say_goodbye.__name__)
    print_func_name(say_goodbye)
    print("goodbye")


say_hello()
say_goodbye()
# 输出:
'''
say_hello
hello
say_goodbye
goodbye
'''

方案示例(略…上正题)

使用函数装饰器

包装器适应所有的旧功能参数
定义者负责包装函数,调用者只负责调用

# 定义函数装饰器
def print_func_name(func):
    # 包装新旧功能
    def wrapper(*args, **kwargs):
        # 增加的新功能
        print(func.__name__)
        # 旧功能
        return func(*args, **kwargs)

    return wrapper  # 返回包装器
# 使用函数装饰器    
@print_func_name    # say_hello = print_func_name(say_hello)
def say_hello(name):
    print(name, "hello")
    return "哈哈"


@print_func_name
def say_goodbye(name, age):
    print(age, name, "goodbye")

# # ---------以上是定义者--以下是调用者-----------------
print(say_hello("灭霸"))
say_goodbye("北极星女孩", 25)

# 输出:
'''
say_hello
灭霸 hello
哈哈
say_goodbye
25 北极星女孩 goodbye
'''

标签:func,函数,python,装饰,say,goodbye,print,hello,name
来源: https://blog.csdn.net/weixin_45179798/article/details/97518962