编辑
2025-06-26
Python
00
请注意,本文编写于 37 天前,最后修改于 37 天前,其中某些信息可能已经过时。

目录

python装饰器
类中高频装饰器
装饰器用法

python装饰器

不改动函数本身的能力的情况下,赋予其更多能力的用法,更加灵活

类中高频装饰器

1、@staticmethod:用于定义静态方法。静态方法不需要访问实例或类本身,它们类似于普通的函数,只是定义在类的命名空间中。

通俗理解:即单独也可以用,但是为了方便管理,相关的放到同一个类中处理

python
class MyClass: @staticmethod def static_method(): print("This is a static method.")

2、@classmethod:用于定义类方法。类方法的第一个参数是 cls,代表类本身。 类方法可以访问类的属性和方法,但不能直接访问实例属性。

通俗理解:可以改类属性和方法,其他的不要动

python
class MyClass: class_variable = 0 @classmethod def class_method(cls): cls.class_variable += 1 print(f"Class variable is now {cls.class_variable}.")

3、@property:将方法转换为只读属性,适合用于需要计算或动态获取属性值的场景

通俗理解:可以按调属性的方式去直接用

python
class MyClass: def __init__(self, value): self._value = value @property def value(self): return self._value

4、@lru_cache:缓存装饰器,缓存函数的结果,以避免重复计算。它实现了一个最近最少使用(Least Recently Used, LRU)缓存机制

通俗理解:即下次再同样的形参输入时,不需要计算,直接用上次的结果返回

python
from functools import lru_cache @lru_cache(maxsize=128) def expensive_computation(x): print(f"Computing {x}...") return x * x # 第一次调用时会进行计算 result1 = expensive_computation(4) # 输出: Computing 4... print(result1) # 输出: 16 # 第二次调用时会直接从缓存中获取结果 result2 = expensive_computation(4) # 不会输出 "Computing 4..." print(result2) # 输出: 16

5、@dataclass:简化类的定义,特别是那些主要用于存储数据的类。通过使用 @dataclass,可以自动生成一些常用的特殊方法,如 initrepreq 等,从而减少样板代码的编写。

通俗理解:自动带有__init__、repreq ,不需要再写了

python
from dataclasses import dataclass @dataclass class Point: x: int y: int

装饰器用法

函数执行计时

python
import time from functools import wraps def timing_decorator(enabled: bool = True): """统计执行func函数的装饰器""" def wrapper_inner_time(func): @wraps(func) def wrapper(*args, **kwargs): if enabled: start_time = time.time() result = func(*args, **kwargs) end_time = time.time() print(f'spend time: {end_time - start_time}') else: result = func(*args, **kwargs) return result return wrapper return wrapper_inner_time # 使用装饰器,启用计时功能 @timing_decorator(enabled=True) def example_function(): time.sleep(1) # 模拟耗时操作 # 使用装饰器,禁用计时功能 @timing_decorator(enabled=False) def another_function(): time.sleep(1) # 模拟耗时操作 # 测试函数 example_function() # 将输出函数执行时间 another_function() # 不会输出函数执行时间

本文作者:lixf6

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!