當前位置: 妍妍網 > 辦公

學習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、機器學習等方面的電子書合集。