最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深度解析Python裝飾器常見用法與進階技巧

 更新時間:2025年06月25日 14:53:36   作者:天天進步2015  
Python 裝飾器(Decorator)是提升代碼可讀性與復用性的強大工具,本文將深入解析 Python 裝飾器的原理,常見用法,進階技巧與最佳實踐,希望可以幫助大家寫出更具專業(yè)水準的 Python 代碼

裝飾器的基本原理

裝飾器本質上是一個高階函數(shù),即:以函數(shù)為參數(shù)并返回新函數(shù)的函數(shù)。它可以在不修改原始函數(shù)代碼的前提下,動態(tài)地為其添加功能。

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print('Before function call')
        result = func(*args, **kwargs)
        print('After function call')
        return result
    return wrapper

@my_decorator
def say_hello():
    print('Hello, world!')

say_hello()

輸出:

Before function call
Hello, world!
After function call

函數(shù)裝飾器的常見用法

1.日志記錄

import logging

def log_decorator(func):
    def wrapper(*args, **kwargs):
        logging.info(f'Calling {func.__name__}')
        return func(*args, **kwargs)
    return wrapper

2.權限校驗

def require_admin(func):
    def wrapper(user, *args, **kwargs):
        if not user.is_admin:
            raise PermissionError('Admin required')
        return func(user, *args, **kwargs)
    return wrapper

3.性能分析

import time

def timeit(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f'{func.__name__} took {end - start:.4f}s')
        return result
    return wrapper

4.緩存機制

from functools import lru_cache

@lru_cache(maxsize=128)
def fib(n):
    return n if n < 2 else fib(n-1) + fib(n-2)

帶參數(shù)的裝飾器

帶參數(shù)的裝飾器需要再包一層函數(shù):

def repeat(times):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for _ in range(times):
                result = func(*args, **kwargs)
            return result
        return wrapper
    return decorator

@repeat(3)
def greet():
    print('Hello!')

類裝飾器與方法裝飾器

類裝飾器

可以用于增強類的功能:

def singleton(cls):
    instances = {}
    def get_instance(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]
    return get_instance

@singleton
class Database:
    pass

方法裝飾器

與函數(shù)裝飾器類似,但要注意 self 的傳遞:

def method_logger(func):
    def wrapper(self, *args, **kwargs):
        print(f'Calling {func.__name__} of {self}')
        return func(self, *args, **kwargs)
    return wrapper

class MyClass:
    @method_logger
    def foo(self):
        print('foo called')

裝飾器的嵌套與組合

多個裝飾器可以疊加使用,執(zhí)行順序為自下而上:

@decorator_a
@decorator_b
def func():
    pass
# 等價于 func = decorator_a(decorator_b(func))

進階技巧:保留元信息與類型提示

裝飾器會改變被裝飾函數(shù)的元信息(如__name__, __doc__),推薦用 functools.wraps 保留原信息:

from functools import wraps

def my_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        return func(*args, **kwargs)
    return wrapper

對于類型提示,可以直接在裝飾器和被裝飾函數(shù)中添加 type hints。

裝飾器最佳實踐

  • 始終使用 functools.wraps 保留函數(shù)元信息
  • 為裝飾器編寫單元測試,確保功能可復用且無副作用
  • 合理使用裝飾器,避免過度嵌套導致調試困難
  • 利用標準庫裝飾器(如 @staticmethod, @classmethod, @property, @lru_cache)提升開發(fā)效率
  • 為裝飾器添加類型提示和文檔字符串

總結

Python 裝飾器讓我們以聲明式、可復用的方式增強函數(shù)和類的行為。掌握裝飾器的原理與用法,不僅能提升代碼的可讀性和復用性,更能讓你的 Python 項目更具專業(yè)水準。建議在實際開發(fā)中多加練習,靈活運用裝飾器解決實際問題。

到此這篇關于深度解析Python裝飾器常見用法與進階技巧的文章就介紹到這了,更多相關Python裝飾器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

宁乡县| 平顺县| 望都县| 沂源县| 蒙城县| 缙云县| 文昌市| 永和县| 壤塘县| 高雄市| 肥西县| 松溪县| 茌平县| 遂昌县| 蒲城县| 泽普县| 桑日县| 璧山县| 高安市| 田林县| 利津县| 霍邱县| 教育| 黄浦区| 乳山市| 达拉特旗| 启东市| 荃湾区| 理塘县| 响水县| 吴堡县| 铜梁县| 柳林县| 罗甸县| 集安市| 廉江市| 兰州市| 广水市| 开江县| 盘山县| 邹平县|