Python装饰器语法糖

博客围绕Python装饰器语法糖展开,装饰器是Python中重要的特性,它能在不修改原函数代码的情况下,为函数添加额外功能,在Python编程里有广泛应用,有助于提升代码的复用性和可维护性。
####装饰器的固定格式
##普通版本
def timer(func):
    def inner(*args,**kwargs):
        '''执行函数之前要做的'''
        ret = func(*args,**kwargs)
        '''执行函数之后要做的'''
        return ret
    return inner

##wraps版本
from functools import wraps

def deco(func):
    @wraps(func) #加在最内层函数正上方
    def wrapper(*args,**kwargs):
        return func(*args,**kwargs)
    return wrapper

####带参数的装饰器
def outer(flag):
    def timer(func):
        def inner(*args,**kwargs):
            if flag:
                print('''执行函数之前要做的''')
            ret = func(*args,**kwargs)
            if flag:
                print('''执行函数之后要做的''')
            return ret
        return inner
    return timer

@outer(True)
def func():
    return  '返回值'

x=func()
print(x)

 

### Python 装饰器语法糖使用方法 Python 中的装饰器通过 `@` 符号来简化函数或类的修饰过程。这种语法糖不仅提高了代码的可读性和简洁度,而且使得功能扩展更加直观。 #### 基本装饰器示例 当想要增强某个函数的功能而不改变其原有定义时,可以利用装饰器。下面展示了一个简单装饰器的应用: ```python def my_decorator(func): def wrapper(): print("Something is happening before the function is called.") func() print("Something is happening after the function is called.") return wrapper @my_decorator def say_hello(): print("Hello!") say_hello() ``` 这段代码展示了如何使用 `@` 语法糖将 `say_hello()` 函数传递给 `my_decorator()` 进行封装[^3]。 #### 参数化的装饰器 如果希望装饰器能够接收参数,则可以通过嵌套一层闭包结构实现更为灵活的功能定制: ```python import functools def repeat(num_times): def decorator_repeat(func): @functools.wraps(func) def wrapper(*args, **kwargs): for _ in range(num_times): value = func(*args, **kwargs) return value return wrapper return decorator_repeat @repeat(num_times=4) def greet(name): print(f"Hello {name}") greet("Alice") ``` 此例子中,`repeat()` 是一个带有参数的高阶装饰器,它可以控制目标函数被执行的具体次数[^1]。 #### 类装饰器应用 除了普通的函数装饰器外,Python 同样允许使用类作为装饰器对象。此类需重写 `__call__` 方法以便能够在调用时生效: ```python class CountCalls: def __init__(self, func): self.func = func self.num_calls = 0 def __call__(self, *args, **kwargs): self.num_calls += 1 print(f"This is call #{self.num_calls} of {self.func.__name__!r}") return self.func(*args, **kwargs) @CountCalls def say_goodbye(person="world"): print(f"Goodbye, {person}") say_goodbye() say_goodbye("Bob") ``` 上述代码片段说明了怎样构建并运用基于类形式的计数型装饰器[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值