Python 中带参数的装饰器


我们知道装饰器是 Python 中非常强大且有用的工具,因为它允许程序员修改函数或类的行为。在本文中,我们将通过多个示例来 了解带参数的装饰器。Python 函数是一等公民,这意味着函数可以像对象一样对待。

  • 函数可以分配给变量,即它们可以被引用。
  • 函数可以作为参数传递给另一个函数。
  • 函数可以从函数返回。

带参数的装饰器与普通装饰器类似。

带参数的装饰器的语法:

@decorator(params)
def func_name():
    ''' Function implementation'''

上面的代码相当于

def func_name():
    ''' Function implementation'''

func_name = (decorator(params))(func_name)
"""

当执行从左到右开始时,调用装饰器(params) ,它返回一个函数对象**fun_obj。使用 fun_obj进行调用fun_obj(fun_name) 。在内部函数内部,执行所需的操作并返回实际的函数引用,该引用将分配给func_name。现在,func_name()**可用于调用应用了装饰器的函数。

带参数的Decorator是如何实现的

  • Python3
def decorators(*args, **kwargs):
    def inner(func):
        '''
        do operations with func
        '''
        return func
    return inner #this is the fun_obj mentioned in the above content

@decorators(params)
def func():
    """
        function implementation
    """

这里的params也可以为空。

首先观察这些:

  • Python3
# Python code to illustrate
# Decorators basic in Python
def decorator_fun(func):
    print("Inside decorator")
    def inner(*args,**kwargs):
        print("Inside inner function")
        print("Decorated the function")
        # do operations with func
        func()
    return inner()
@decorator_fun
def func_to():
    print("Inside actual function")
func_to

其他方式:

  • Python3
# Python code to illustrate
# Decorators with parameters in Python

def decorator_fun(func):
print("Inside decorator")

def inner(*args, **kwargs):
    print("Inside inner function")
    print("Decorated the function")

    func()

return inner


def func_to():
    print("Inside actual function")

# another way of using decorators
decorator_fun(func_to)()

输出:

Inside decorator
Inside inner function
Decorated the function
Inside actual function

让我们来看另一个例子:

示例#1:

  • Python3
# Python code to illustrate
# Decorators with parameters in Python

def decorator(*args, **kwargs):
    print("Inside decorator")

    def inner(func):

        # code functionality here
        print("Inside inner function")
        print("I like", kwargs['like'])

        func()

    # returning inner function
    return inner

@decorator(like = "geeksforgeeks")
def my_func():
    print("Inside actual function")

输出:

Inside decorator
Inside inner function
I like geeksforgeeks
Inside actual function

示例#2:

  • Python3
# Python code to illustrate
# Decorators with parameters in Python

def decorator_func(x, y):

    def Inner(func):

        def wrapper(*args, **kwargs):
            print("I like Geeksforgeeks")
            print("Summation of values - {}".format(x+y) )

            func(*args, **kwargs)

        return wrapper
    return Inner


# Not using decorator
def my_fun(*args):
    for ele in args:
        print(ele)

# another way of using decorators
decorator_func(12, 15)(my_fun)('Geeks', 'for', 'Geeks')

输出:

I like Geeksforgeeks
Summation of values - 27
Geeks
for
Geeks

这个例子还告诉我们,外部函数的参数可以通过封闭的内部函数来访问。

示例#3:

  • Python3
# Python code to illustrate
# Decorators with parameters in Python (Multi-level Decorators)


def decodecorator(dataType, message1, message2):
    def decorator(fun):
        print(message1)
        def wrapper(*args, **kwargs):
            print(message2)
            if all([type(arg) == dataType for arg in args]):
                return fun(*args, **kwargs)
            return "Invalid Input"
        return wrapper
    return decorator


@decodecorator(str, "Decorator for 'stringJoin'", "stringJoin started ...")
def stringJoin(*args):
    st = ''
    for i in args:
        st += i
    return st


@decodecorator(int, "Decorator for 'summation'\n", "summation started ...")
def summation(*args):
    summ = 0
    for arg in args:
        summ += arg
    return summ


print(stringJoin("I ", 'like ', "Geeks", 'for', "geeks"))
print()
print(summation(19, 2, 8, 533, 67, 981, 119))

输出:

Decorator for 'stringJoin'
Decorator for 'summation'

stringJoin started ...
I like Geeksforgeeks

summation started ...
1729

1. 装饰器内部

装饰器 python 内部

2. 函数内部

内部函数装饰器-python

注意:图像快照是使用 PythonTutor 拍摄的。


原文链接:codingdict.net