编写装饰器,确保装饰器可以使⽤或不使⽤括号
时间: 2024-12-03 07:06:31 浏览: 7
编写装饰器的关键在于它是一个特殊类型的函数,用于修改其他函数的功能而不需要改变其源代码。装饰器通常接受一个函数作为输入,并返回一个新的函数,这个新函数包装了原始函数并添加额外的行为。为了使装饰器可以使用或不使用括号,我们需要设计一个可选参数的装饰器。
举个例子,下面是一个简单的装饰器,它可以在不带括号调用函数时打印一条消息:
```python
def print_message(func):
def wrapper(*args, **kwargs): # 使用*args和**kwargs来处理不定参数
if len(args) == 0 and len(kwargs) == 0: # 如果既没传入位置参数也没传入关键字参数,就认为没有调用
print("Function called without arguments.")
result = func(*args, **kwargs)
return result
return wrapper
# 装饰器使用示例
@print_message
def say_hello(name="World"):
return f"Hello, {name}!"
# 使用带有括号的情况
hello_with_brackets = say_hello("Alice")
print(hello_with_brackets) # 输出: Function called without arguments. Hello, Alice!
# 不使用括号的情况
hello_without_brackets = say_hello()
print(hello_without_brackets) # 输出: Function called without arguments. Hello, World!
```
在这个例子中,如果我们直接`say_hello()`,装饰器会检测到没有参数传递,然后打印一条信息。如果提供了参数,则不会显示那条消息。
阅读全文