溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python上下文管理器如何實現(xiàn)

發(fā)布時間:2022-03-29 16:59:08 來源:億速云 閱讀:115 作者:iii 欄目:移動開發(fā)

今天小編給大家分享一下Python上下文管理器如何實現(xiàn)的相關(guān)知識點,內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

什么時候可以考慮上下文管理器

當(dāng)你的代碼邏輯需要用到如下關(guān)鍵字時,可以考慮使用上下文管理器讓你的代碼更加優(yōu)雅:

try:
	...
finally:
	...

接下來介紹實現(xiàn)上下文管理器的三種方法。

方法1(上下文管理器協(xié)議)

總所周知,open()是默認(rèn)支持上下文管理器的。所以打開一個txt文件,并向里面寫入內(nèi)容,再關(guān)閉這個文件的代碼可以這樣寫:

with open("1.txt", "w") as file:
file.write("this is a demo")

這是等同于:

file = None
try:
    file = open("1.txt", "w")
    file.write("this is a demo")
finally:
    file.close()

要在Python中實現(xiàn)with語句的使用,就需要借助上下文管理器協(xié)議。也就是需要實現(xiàn)__enter__和__exit__兩個魔法方法。

class OpenMyFile(object):
    def __init__(self, path):
        self.path = path

    def __enter__(self):
        print("opening the txt")
        self.f = open(self.path, "w")
        return self

    def __exit__(self, *args, **kwargs):
        print("closing the txt")
        self.f.close()

    def write(self, string):
        print("writing...")
        self.f.write(string)


with OpenMyFile("2.txt") as file:
    file.write("this is a demo2")

# 輸出:
opening the txt
writing...
closing the txt

同時能夠看到本地生成了2.txt文件。需要注意的是,__enter__得return實例對象,不然會報異常:AttributeError: "NoneType" object has no attribute "write"

這是因為Python中的函數(shù)默認(rèn)返回None。

方法2(@contextmanager)

利用contextlib中的contextmanager裝飾器。

from contextlib import contextmanager


@contextmanager
def open_my_file(path):
    print("opening the txt")
    f = open("3.txt", "w")
    yield f
    print("closing the txt")
    f.close()


with open_my_file("3.txt") as file:
    file.write("this is demo3")

# 輸出:
opening the txt
closing the txt

在@contextmanager裝飾的函數(shù)中,需要用yield隔開兩個邏輯語句。這里yield出來的對象會被as后面的變量接收。

方法3(contextlib.closing())

利用contextlib中的closing()方法。

from contextlib import closing


class OpenMyFile(object):
    def __init__(self, path):
        print("opening the txt")
        self.f = open(path, "w")

    def write(self, string):
        self.f.write(string)

    def close(self):
        print("closing the txt")
        self.f.close()


with closing(OpenMyFile("4.txt")) as file:
    file.write("this is demo4")

# 輸出:
opening the txt
closing the txt

與方法1不同。經(jīng)過closing()方法包裝過后,在with語句結(jié)束時,會強(qiáng)制調(diào)用對象的close()方法。所以使用方法3時,需要定義的方法不是__exit__()而是close()。

以上就是“Python上下文管理器如何實現(xiàn)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI