(第十篇) __enter__、__exit__

发布时间 2023-05-24 11:05:46作者: hechengQAQ

摘要:

__enter__()__exit__()是Python中的上下文管理器方法,主要用于对资源进行管理,比如文件、网络连接等。在使用with语句时,会自动调用这两个方法,即__enter__()在进入with代码块之前被调用,__exit__()在离开with代码块后被调用,可以确保资源在使用完后正确地释放

例子:

上下文管理器处理文件:

__init__方法初始化上下文管理器对象,__enter__方法会在进入with语句块之前被调用,用于执行一些预处理操作,例如打开文件、建立数据库连接等。如果__enter__方法返回一个值,该值会被赋给as关键字后面的变量,当离开with语句块时,会自动调用上下文对象的__exit__方法,以进行一些清理操作,例如关闭文件、断开数据库连接等

class MyFile:
    def __init__(self, filename, mode):
        self.filename = filename
        self.mode = mode

    def __enter__(self):
        self.file = open(self.filename, self.mode)
        return self.file

    def __exit__(self, exc_type, exc_value, traceback):
        self.file.close()

with MyFile('example.txt', 'w') as f:
    f.write('Hello, world!')

网络连接的管理的例子:

定义了一个名为NetworkConnection的类,它代表了一个网络连接。当我们使用with语句连接到网络时,NetworkConnection的__enter__()方法会被调用以创建并连接套接字,并返回套接字对象。当with代码块执行结束时,__exit__()方法会被调用来关闭套接字。 

import socket

class NetworkConnection:
    def __init__(self, hostname, port):
        self.hostname = hostname
        self.port = port
        self.socket = None

    def __enter__(self):
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket.connect((self.hostname, self.port))
        return self.socket

    def __exit__(self, exc_type, exc_value, traceback):
        self.socket.close()

with NetworkConnection('localhost', 8080) as conn:
    conn.sendall(b'Hello, world!')

其他例子: