Python 装饰器

简介:

  装饰器(Decorators)是 Python 的一个重要部分。简单地说:他们是修改其他函数的功能的函数。他们有助于让我们的代码更简短,也更Pythonic(Python范儿)。

1.装饰器的基本使用

复制代码
# 注意程序运行步骤
def decorator(func): # 这里的参数func其实就是foo函数
    def inner():
        print("1.程序第一步执行到这里")
        func() # 这里的func函数其实就是foo函数
        print('3.这是inner函数')
    return inner
def foo():
    print('2.这是foo函数')
foo = decorator(foo)
foo()
复制代码

 2.不带参数的装饰器

复制代码
def decorator(func): # 这里的参数func其实就是foo函数
    def inner():
        func_name = func.__name__
        print("1.程序第一步执行到这里,执行函数名称:",func_name)
        func()
        print("3.程序最后运行到这里")
        print("----------------------------------------------")
    return inner

@decorator  # foo = decorator(foo)
def foo():
    print('2.foo..')
@decorator  # doo = decorator(doo)
def doo():
    print('2.doo..')
foo()
doo()
复制代码

3.带参数的被装饰的函数

复制代码
def decorator(func):
    def inner(a, b):
        func_name = func.__name__
        print("1.程序第一步执行到这里,执行函数名称:", func_name)
        func(a, b)
        print("3.程序最后运行到这里")
        print("----------------------------------------------")
    return inner

@decorator
# add = decorator(addnum)
# 实现两数相加操作
def addnum(num1, num2):
    print("2.两数相加结果:",num1 + num2)

@decorator
# subnum = decorator(subnum)
# 实现两数相减操作
def subnum(num1, num2):
    print("2.两数相减结果:",num1 - num2)
addnum(10, 5)
subnum(10, 5)
复制代码

4.带参数的被装饰的函数和装饰器

复制代码
def decorator_arg(flag=0):
    def decorator(func):
        def inner(a, b):
            func_name = func.__name__
            print("1.程序第一步执行到这里,执行函数名称:", func_name)
            func(a, b)
            print("3.程序运行到这里")
            if flag:
                print("4.传递给装饰器的参数为:",flag)
                print("----------------------------------------------")
        return inner
    return decorator


@decorator_arg(2)
# add = decorator(addnum)
# 实现两数相加操作
def addnum(num1, num2):
    print("2.两数相加结果:",num1 + num2)

@decorator_arg(2)
# subnum = decorator(subnum)
# 实现两数相减操作
def subnum(num1, num2):
    print("2.两数相减结果:",num1 - num2)
addnum(10, 5)
subnum(10, 5)
复制代码

5.python装饰器总结

复制代码
def decorator_name(*args,**kwargs):  # 定义装饰器,可能带参数
    def decorator(func):  # 装饰器核心,以被装饰的函数对象为参数,返回装饰后的函数对象
        def inner(*args, **kvargs):  # 装饰的过程,参数列表适应不同参数的函数
            pass  # 修改函数调用前的行为
            func(*args, **kvargs)  # 调用函数
            pass  # 修改函数调用后的行为
        return inner
    return decorator

@decorator_name()    # 给函数加上装饰器
def funcname(参数):
    pass    # 自己定义的函数体
复制代码

 文章转载:https://www.cnblogs.com/xingxingnbsp/p/11684216.html

原文地址:https://www.cnblogs.com/shenmiyang/p/14893169.html