Python中装饰器兼容加括号和不加括号的写法详解( 二 )


@my_decorator_with_arg("Hello")
def say_hello():
print("Hello!")
say_hello()
```
上述代码中,我们定义了一个带参数的装饰器函数my_decorator_with_arg,并返回一个装饰器函数my_decorator 。在使用my_decorator_with_arg装饰器的时候,我们必须传递一个参数 。这个参数会作为my_decorator函数的参数传递进去 。
在调用say_hello函数的时候,它实际上是调用了wrapper函数 。由于我们传递了参数"Hello",所以在打印信息的时候会显示"Before the function is called with arg Hello."和"After the function is called with arg Hello." 。
2. 不加括号的装饰器会延迟执行
不加括号的装饰器语法不会立即执行装饰器函数,而是在函数调用的时候再执行装饰器函数 。这种语法适用于装饰器函数不需要传递参数的情况 。
以下是一个使用不加括号的装饰器语法的例子:
```
def my_decorator(func):
def wrapper():
print("Before the function is called.")
func()
print("After the function is called.")
return wrapper
@my_decorator
def say_hello():
print("Hello!")
say_hello()
```
上述代码中,我们使用不加括号的装饰器语法来装饰say_hello函数 。由于装饰器函数my_decorator不需要传递参数,所以我们可以使用不加括号的语法 。
在调用say_hello函数的时候,它实际上是调用了wrapper函数 。由于我们使用的是不加括号的装饰器语法,所以my_decorator函数并没有立即执行 。它会在调用say_hello函数的时候再执行 。
五、总结
装饰器是Python中非常重要的一个概念,它可以用来扩展函数的功能,同时也可以提高代码的复用性 。装饰器的写法可以有很多种,其中比较常见的就是加括号和不加括号的写法 。加括号的装饰器会立即执行装饰器函数,并将返回的函数作为装饰器;不加括号的装饰器不会立即执行装饰器函数,而是在函数调用的时候再执行装饰器函数 。在使用装饰器的时候,我们需要根据具体的情况选择合适的写法 。

猜你喜欢