当前位置: 欣欣网 > 办公

学习Python,你不得不掌握的6个装饰器!

2024-03-04办公

点击蓝字 · 关注我们

大家好,我是Bryce~

这次分享一下python中 6个 常用的装饰器,包括@timer、@memoize、@property等。

在Python中,装饰器是一种函数,用于修改其他函数的功能。装饰器允许您在不修改原始函数代码的情况下,添加额外的功能或修改函数的行为。这种能力使得装饰器成为Python中强大而灵活的工具。

1. @timer

@timer 装饰器用于计算函数执行的时间。这对于性能分析和调试非常有用。

import time
deftimer(func):
defwrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"Function {func.__name__} executed in {(end_time - start_time):.2f} seconds")
return result
return wrapper
@timer
defheavy_task():
# 模拟耗时操作
time.sleep(2)
heavy_task() # 输出函数执行时间

2. @memoize

@memoize 装饰器用于缓存函数的返回值,以避免重复计算相同的输入。这可以显著提高函数的性能,特别是在需要频繁调用且计算成本高昂的函数时。

defmemoize(func):
cache = {}
defwrapper(*args):
if args notin cache:
cache[args] = func(*args)
return cache[args]
return wrapper
@memoize
deffibonacci(n):
if n <= 1:
return n
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(10)) # 输出: 55,第10个斐波那契数



3. @property

@property 装饰器用于将方法转换为属性,使得可以像访问属性一样访问方法,而不是调用方法。

classCircle:
def__init__(self, radius):
self.radius = radius
@property
defarea(self):
return3.14 * self.radius ** 2
# 访问属性而不是调用方法
circle = Circle(5)
print(circle.area) # 输出: 78.5

4. @abstractmethod

@abstractmethod 装饰器用于定义抽象方法,这些方法在基类中声明但在子类中必须实现。如果子类没有实现抽象方法,将会引发错误。

from abc import ABC, abstractmethod
classShape(ABC):
@abstractmethod
defarea(self):
pass
classSquare(Shape):
def__init__(self, side):
self.side = side
defarea(self):
return self.side ** 2
# 子类必须实现抽象方法
square = Square(4)
print(square.area()) # 输出: 16



5. @functools.wraps

@functools.wraps 装饰器用于将装饰器的元数据复制到被装饰的函数上,这样可以保留原始函数的名称、文档字符串等属性。

import functools
defmy_decorator(func):
@functools.wraps(func)
defwrapper(*args, **kwargs):
print("Something is happening before the function is called.")
result = func(*args, **kwargs)
print("Something is happening after the function is called.")
return result
return wrapper
@my_decorator
defsay_hello():
"""A simple function that returns 'Hello'."""
return"Hello"
# 保留原始函数的元数据
print(say_hello.__name__) # 输出: say_hello
print(say_hello.__doc__) # 输出: A simple function that returns 'Hello'.


6. 自定义装饰器

除了Python提供的内置装饰器外,还可以自定义装饰器来满足特定需求。下面是一个简单的示例,用于记录函数的执行时间。

import time
defcalculate_time(func):
defwrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"Execution time: {end_time - start_time} seconds")
return result
return wrapper
@calculate_time
defheavy_task():
# 模拟耗时操作
time.sleep(2)
heavy_task() # 输出执行时间


总结

装饰器是Python中强大的功能之一,它们允许我们以一种简洁而优雅的方式修改函数的行为。通过使用装饰器,我们可以轻松地添加日志记录、性能分析、缓存等功能,而无需修改原始函数的代码。因此,掌握装饰器的使用方法对于成为高效的Python开发人员至关重要。

你好!我是Bryce,自学从机械专业转行大厂数据分析。转正半年被主管破格提拔晋升一级,目前是某项目数据业务负责人。日常输出数分技术、AI编程、职场认知相关内容,欢迎交流!

关注我

常进步

关注下方公众号,回复【数据分析书籍】,即可获取SQL、Python、机器学习等方面的电子书合集。