不改动函数本身的能力的情况下,赋予其更多能力的用法,更加灵活
1、@staticmethod:用于定义静态方法。静态方法不需要访问实例或类本身,它们类似于普通的函数,只是定义在类的命名空间中。
通俗理解:即单独也可以用,但是为了方便管理,相关的放到同一个类中处理
pythonclass MyClass:
@staticmethod
def static_method():
print("This is a static method.")
2、@classmethod:用于定义类方法。类方法的第一个参数是 cls,代表类本身。 类方法可以访问类的属性和方法,但不能直接访问实例属性。
通俗理解:可以改类属性和方法,其他的不要动
pythonclass MyClass:
class_variable = 0
@classmethod
def class_method(cls):
cls.class_variable += 1
print(f"Class variable is now {cls.class_variable}.")
3、@property:将方法转换为只读属性,适合用于需要计算或动态获取属性值的场景
通俗理解:可以按调属性的方式去直接用
pythonclass MyClass:
def __init__(self, value):
self._value = value
@property
def value(self):
return self._value
4、@lru_cache:缓存装饰器,缓存函数的结果,以避免重复计算。它实现了一个最近最少使用(Least Recently Used, LRU)缓存机制
通俗理解:即下次再同样的形参输入时,不需要计算,直接用上次的结果返回
pythonfrom 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,可以自动生成一些常用的特殊方法,如 init、repr、eq 等,从而减少样板代码的编写。
通俗理解:自动带有__init__、repr、eq ,不需要再写了
pythonfrom dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
函数执行计时
pythonimport 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 许可协议。转载请注明出处!