自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Python 中的裝飾器如何工作?

開(kāi)發(fā) 前端
裝飾器(Decorator)是 Python 中一種高級(jí)特性,它允許程序員修改或增強(qiáng)函數(shù)和方法的行為,而無(wú)需直接更改其源代碼。

裝飾器(Decorator)是 Python 中一種高級(jí)特性,它允許程序員修改或增強(qiáng)函數(shù)和方法的行為,而無(wú)需直接更改其源代碼。裝飾器本質(zhì)上是一個(gè)返回函數(shù)的高階函數(shù),它可以接收一個(gè)函數(shù)作為參數(shù),并返回一個(gè)新的或修改后的函數(shù)。通過(guò)使用裝飾器,您可以實(shí)現(xiàn)諸如日志記錄、訪問(wèn)控制、性能測(cè)量等功能,同時(shí)保持代碼的清晰和模塊化。

裝飾器的工作原理

裝飾器定義:首先,您需要定義一個(gè)裝飾器函數(shù)。這個(gè)函數(shù)接受一個(gè)被裝飾的函數(shù)作為參數(shù),并返回一個(gè)新的函數(shù)(通常是內(nèi)部定義的一個(gè)閉包),該新函數(shù)可以在執(zhí)行原始函數(shù)之前或之后添加額外邏輯。

應(yīng)用裝飾器:要將裝飾器應(yīng)用于某個(gè)函數(shù),可以使用 @decorator_name 語(yǔ)法糖,放在函數(shù)定義之前。這相當(dāng)于在函數(shù)定義后立即調(diào)用裝飾器并將函數(shù)作為參數(shù)傳遞給它。

執(zhí)行流程:當(dāng)調(diào)用被裝飾的函數(shù)時(shí),實(shí)際上是在調(diào)用裝飾器返回的新函數(shù)。這意味著您可以在實(shí)際執(zhí)行目標(biāo)函數(shù)之前或之后插入自定義行為。

示例:基本裝飾器

def my_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper
@my_decorator
def say_hello():
    print("Hello!")
say_hello()
# 輸出:
# Something is happening before the function is called.
# Hello!
# Something is happening after the function is called.

在這個(gè)例子中,my_decorator 是一個(gè)簡(jiǎn)單的裝飾器,它包裝了 say_hello 函數(shù),在調(diào)用前后打印消息。

帶參數(shù)的裝飾器

有時(shí),您可能希望裝飾器本身也能接受參數(shù)。為了實(shí)現(xiàn)這一點(diǎn),可以創(chuàng)建一個(gè)“裝飾器工廠”——即一個(gè)返回裝飾器的函數(shù)。

示例:帶參數(shù)的裝飾器

def repeat(num_times):
    def decorator_repeat(func):
        def wrapper(*args, **kwargs):
            for _ in range(num_times):
                result = func(*args, **kwargs)
            return result
        return wrapper
    return decorator_repeat
@repeat(num_times=3)
def greet(name):
    print(f"Hello {name}")
greet("Alice")
# 輸出:
# Hello Alice
# Hello Alice
# Hello Alice

這里,repeat 是一個(gè)裝飾器工廠,它根據(jù)提供的 num_times 參數(shù)生成一個(gè)具體的裝飾器。

類(lèi)裝飾器

除了函數(shù),Python 還支持類(lèi)裝飾器。類(lèi)裝飾器通常用于修改類(lèi)的行為或?qū)傩?。它們接收?lèi)作為參數(shù),并返回一個(gè)新的類(lèi)或修改后的類(lèi)。

示例:類(lèi)裝飾器

def add_method(cls):
    def decorator(func):
        setattr(cls, func.__name__, func)
        return cls
    return decorator
@add_method
class MyClass:
    pass
@add_method(MyClass)
def new_method(self):
    print("This is a dynamically added method.")
obj = MyClass()
obj.new_method()  # 輸出: This is a dynamically added method.

在這個(gè)例子中,add_method 是一個(gè)類(lèi)裝飾器,它向 MyClass 動(dòng)態(tài)添加了一個(gè)新的方法。

內(nèi)置裝飾器

Python 提供了一些內(nèi)置的裝飾器來(lái)簡(jiǎn)化常見(jiàn)的編程任務(wù):

@classmethod 和 @staticmethod:用于定義類(lèi)方法和靜態(tài)方法。

@property:用于將類(lèi)的方法轉(zhuǎn)換為只讀屬性。

@functools.lru_cache:用于緩存函數(shù)的結(jié)果以提高性能。

@dataclasses.dataclass:用于自動(dòng)為類(lèi)生成特殊方法(如 __init__() 和 __repr__())。

示例:使用 @property

class Circle:
    def __init__(self, radius):
        self._radius = radius
    @property
    def radius(self):
        """The radius property."""
        print("Getting radius")
        return self._radius
    @radius.setter
    def radius(self, value):
        if value >= 0:
            self._radius = value
        else:
            raise ValueError("Radius must be non-negative")
circle = Circle(5)
print(circle.radius)  # 輸出: Getting radius\n5
circle.radius = 10
print(circle.radius)  # 輸出: Getting radius\n10

使用多個(gè)裝飾器

如果一個(gè)函數(shù)被多個(gè)裝飾器修飾,則這些裝飾器按照從下到上的順序依次應(yīng)用。也就是說(shuō),最接近函數(shù)定義的裝飾器最先執(zhí)行。

示例:多個(gè)裝飾器

def decorator_one(func):
    def wrapper():
        print("Decorator one")
        func()
    return wrapper
def decorator_two(func):
    def wrapper():
        print("Decorator two")
        func()
    return wrapper
@decorator_one
@decorator_two
def hello():
    print("Hello!")
hello()
# 輸出:
# Decorator one
# Decorator two
# Hello!

在這個(gè)例子中,decorator_two 首先被應(yīng)用,然后是 decorator_one。

總結(jié)

裝飾器是 Python 中非常強(qiáng)大且靈活的工具,它們可以讓您以優(yōu)雅的方式擴(kuò)展或修改函數(shù)和類(lèi)的功能。通過(guò)理解裝飾器的工作原理以及如何構(gòu)建自己的裝飾器,您可以編寫(xiě)出更加簡(jiǎn)潔、可維護(hù)和功能豐富的代碼。隨著經(jīng)驗(yàn)的積累,您還將發(fā)現(xiàn)更多關(guān)于裝飾器的高級(jí)用法和最佳實(shí)踐。

責(zé)任編輯:華軒 來(lái)源: 測(cè)試開(kāi)發(fā)學(xué)習(xí)交流
相關(guān)推薦

2010-02-01 17:50:32

Python裝飾器

2022-09-19 23:04:08

Python裝飾器語(yǔ)言

2021-04-11 08:21:20

Python@property裝飾器

2016-11-01 09:24:38

Python裝飾器

2021-06-03 09:18:25

裝飾器模式包裝

2023-02-07 07:47:52

Python裝飾器函數(shù)

2024-05-24 11:36:28

Python裝飾器

2021-06-14 09:25:20

PythonPython 3.9編程語(yǔ)言

2022-09-14 08:16:48

裝飾器模式對(duì)象

2024-09-12 15:32:35

裝飾器Python

2025-04-14 08:35:00

Python類(lèi)裝飾器裝飾器

2022-09-27 11:01:08

Python裝飾器

2021-07-27 15:58:12

Python日志代碼

2023-12-11 15:51:00

Python裝飾器代碼

2021-06-01 07:19:58

Python函數(shù)裝飾器

2024-11-04 15:30:43

Python裝飾器函數(shù)

2024-05-10 12:33:06

flask裝飾器

2022-05-10 09:12:16

TypeScript裝飾器

2022-09-21 09:04:07

Python裝飾器

2023-12-13 13:28:16

裝飾器模式Python設(shè)計(jì)模式
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)