Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimanakah penghias dan pengurus konteks berfungsi dalam Python?

Bagaimanakah penghias dan pengurus konteks berfungsi dalam Python?

王林
王林asal
2023-10-20 19:04:571340semak imbas

Bagaimanakah penghias dan pengurus konteks berfungsi dalam Python?

Bagaimanakah penghias dan pengurus konteks berfungsi dalam Python?

Dalam Python, penghias dan pengurus konteks ialah dua konsep dan fungsi yang sangat berguna. Kesemuanya direka untuk memudahkan kod, meningkatkan kebolehbacaan kod dan memudahkan penggunaan semula kod.

1. Penghias
Penghias ialah fungsi khas dalam Python yang digunakan untuk mengubah suai kelakuan sesuatu fungsi. Ia membolehkan kami membungkus atau melanjutkan fungsi asal tanpa mengubah suainya. Penghias digunakan secara meluas dalam banyak rangka kerja dan perpustakaan Python, seperti Flask, Django, dsb., dan juga digunakan secara meluas dalam banyak senario kerja praktikal.

Struktur asas penghias adalah seperti berikut:

def decorator_function(func):
    def wrapper(*args, **kwargs):
        # 在函数执行之前的操作
        result = func(*args, **kwargs)
        # 在函数执行之后的操作
        return result
    return wrapper

Fungsi penghias fungsi_penghias menerima fungsi sebagai parameter dan mengembalikan fungsi baharupembungkus. Dalam fungsi wrapper, kita boleh melaksanakan operasi yang diperlukan sebelum dan selepas melaksanakan fungsi asal. decorator_function接收一个函数作为参数,并返回一个新的函数wrapper。在wrapper函数中,我们可以在执行原始函数之前和之后执行所需的操作。

下面是一个使用装饰器的例子,来计算函数的执行时间:

import time

def calculate_time(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"函数 {func.__name__} 的执行时间为 {end_time - start_time} 秒")
        return result
    return wrapper

@calculate_time
def my_function():
    # 执行一些耗时的操作
    time.sleep(2)
    print("函数运行完毕")

my_function()

在上述例子中,我们定义了一个calculate_time的装饰器函数,并通过@calculate_time将其应用到my_function函数上。当调用my_function时,装饰器函数会被调用,记录函数的执行时间并打印出来。

二、上下文管理器
上下文管理器是一种在特定作用域下执行代码的工具,它能够确保在使用资源之前和之后进行正确的初始化和清理操作。上下文管理器通常会使用with语句来进行调用。

我们可以通过两种方式来定义一个上下文管理器:使用类装饰器或者contextmanager装饰器。

(1)使用类装饰器方式实现上下文管理器:

class MyContextManager:
    def __enter__(self):
        # 初始化资源
        print("进入上下文管理器,初始化资源")
        return self
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        # 清理资源
        print("退出上下文管理器,清理资源")

with MyContextManager() as my_context:
    # 使用资源
    print("使用上下文管理器中的资源")

在上述例子中,我们定义了一个名为MyContextManager的上下文管理器类,实现了__enter____exit__方法。在__enter__方法中,我们可以进行资源的初始化工作,在__exit__方法中,我们可以进行资源的清理工作。在with语句中,我们使用as关键字指定了一个名称my_context,这样就可以在with语句块内部使用该名称来引用上下文管理器。

(2)使用contextmanager装饰器方式实现上下文管理器:

from contextlib import contextmanager

@contextmanager
def my_context_manager():
    # 初始化资源
    print("进入上下文管理器,初始化资源")
    try:
        yield
    finally:
        # 清理资源
        print("退出上下文管理器,清理资源")

with my_context_manager():
    # 使用资源
    print("使用上下文管理器中的资源")

在上述例子中,我们使用contextmanager装饰器定义了一个生成器函数my_context_manager。在生成器函数内部,我们可以进行资源的初始化和清理工作。yield表达式之前的代码块相当于__enter__方法,yield表达式之后的代码块相当于__exit__方法。在with语句中,我们不需要使用as

Berikut ialah contoh menggunakan penghias untuk mengira masa pelaksanaan fungsi:

rrreee
Dalam contoh di atas, kami mentakrifkan kira_masa fungsi penghias dan gunakannya pada fungsi my_function melalui @calculate_time. Apabila my_function dipanggil, fungsi penghias akan dipanggil, masa pelaksanaan fungsi akan direkodkan dan dicetak.

#🎜🎜# 2. Pengurus konteks #🎜🎜# Pengurus konteks ialah alat yang melaksanakan kod dalam skop tertentu Ia memastikan operasi permulaan dan pembersihan yang betul sebelum dan selepas menggunakan sumber. Pengurus konteks biasanya dipanggil menggunakan pernyataan with. #🎜🎜##🎜🎜#Kita boleh mentakrifkan pengurus konteks dalam dua cara: menggunakan penghias kelas atau penghias pengurus konteks. #🎜🎜##🎜🎜# (1) Gunakan penghias kelas untuk melaksanakan pengurus konteks: #🎜🎜#rrreee#🎜🎜#Dalam contoh di atas, kami mentakrifkan kelas pengurus konteks bernama MyContextManager melaksanakan kaedah __enter__ dan __exit__. Dalam kaedah __enter__, kita boleh memulakan sumber dan dalam kaedah __exit__, kita boleh membersihkan sumber. Dalam pernyataan with, kami menggunakan kata kunci as untuk menentukan nama my_context, supaya ia boleh digunakan dalam with pernyataan Nama ini digunakan di dalam blok untuk merujuk kepada pengurus konteks. #🎜🎜##🎜🎜# (2) Gunakan penghias <code>contextmanager untuk melaksanakan pengurus konteks: #🎜🎜#rrreee#🎜🎜#Dalam contoh di atas, kami menggunakan contextmanager Kod>penghias mentakrifkan fungsi penjana <code>my_context_manager. Di dalam fungsi penjana, kita boleh memulakan dan membersihkan sumber. Blok kod sebelum ungkapan yield adalah bersamaan dengan kaedah __enter__ dan blok kod selepas ungkapan yield adalah bersamaan dengan __keluar__ kaedah. Dalam pernyataan with, kami tidak perlu menyatakan nama pengurus konteks menggunakan kata kunci as. #🎜🎜##🎜🎜#Ringkasan: #🎜🎜#Penghias dan pengurus konteks ialah konsep dan ciri yang sangat berguna dalam Python. Penghias boleh digunakan untuk mengubah suai tingkah laku fungsi dan digunakan secara meluas dalam banyak rangka kerja dan perpustakaan. Pengurus konteks boleh melaksanakan kod dalam skop tertentu dan memastikan sumber dimulakan dan dibersihkan dengan betul. Kedua-duanya boleh memudahkan penulisan kod, meningkatkan kebolehbacaan kod dan memudahkan penggunaan semula kod. Di atas ialah pengenalan asas dan kod contoh tentang penghias dan pengurus konteks saya harap ia akan membantu anda. #🎜🎜#

Atas ialah kandungan terperinci Bagaimanakah penghias dan pengurus konteks berfungsi dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn