首页 > 其他分享 >(第十篇) __enter__、__exit__

(第十篇) __enter__、__exit__

时间:2023-05-24 11:13:59浏览次数:21  
标签:__ socket self 第十篇 exit enter def

摘要:

__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!')

其他例子:

class ContextManager:
    def __init__(self):
        print("Initialized")
    
    def __enter__(self):
        print("Entered")
        return self
    
    def __exit__(self, exc_type, exc_value, traceback):
        print("Exited")

with ContextManager() as cm:
    print("Processing 1")
    print("Processing 2")


# 输出:
Initialized
Entered
Processing 1
Processing 2
Exited

标签:__,socket,self,第十篇,exit,enter,def
From: https://www.cnblogs.com/hechengQAQ/p/17427398.html

相关文章

  • flask框架使用unittest单元测试
    user_labels_api.py1#-*-coding:utf-8-*-2#Author:Ethan3#Time:2023/5/1612:504fromflaskimportFlask,jsonify,render_template,request,json5importrequests6#fromflask_sqlalchemyimportSQLAlchemy7app=Flask(__name__)8#bd......
  • 日常问题记录: HP LoadRunner Controller 已停止工作
    环境描述:系统:windowsserver压测工具:Loadrunner11现象描述:Controller在执行一段时间后崩溃,提示:HPLoadRunnerController已停止工作;根据并发用户多少执行时间基本成比例;例如12并发用户3小时,24并发用户1.5小时Windows提示信息:错误应用程序名称:wlrun.exe,版本:11.0.0.......
  • Apache Hudi 在袋鼠云数据湖平台的设计与实践
    在大数据处理中,实时数据分析是一个重要的需求。随着数据量的不断增长,对于实时分析的挑战也在不断加大,传统的批处理方式已经不能满足实时数据处理的需求,需要一种更加高效的技术来解决这个问题。ApacheHudi(HadoopUpsertsDeletesandIncrementalProcessing)就是这样一种技术,提供......
  • 周三
    题目描述:给定两个字符串s和t,求是否存在一种将t中的字符重新排列后得到s的排列。设计思路:首先需要判断两个字符串是否长度相等,如果不相等则无法重新排列成相等的字符串。统计字符串s中每个字符的出现次数,存储在一个freq数组中。遍历字符串t,对于每个字符c,将freq[c]的值减一,如果......
  • .net 6.0 获取天气相关
    之前做网站的时候,有个需求获取实时天气相关信息,找了一些开放免费的接口,过了几周发现大数据推了好多类似的帖子(真怪,需要你的时候你不来,很气,拿小本本记下了)首先里一下思路,获取天气有哪些种方式。我在查阅资料的过程中,找到了两种相对比较友好的(对应以下两个接口网站)。经纬度获取和......
  • ALLEGRO建立等长规则并设定了等长目标线,但是精度调却不变绿色
    1.下面设定了等长规则,也设定了TARGET等长目标线,后面的进度条却不变颜色 2,  3.再回到CM里打开规则管理器的开关   ......
  • Entity Framework的最佳实践一
    EntityFramework(EF)Core是轻量化、可扩展、开源和跨平台版的常用EntityFramework数据访问技术。EFCore可用作对象关系映射程序(O/RM) 创建DbContext 对象DbContext的生存期DbContext 的生存期从创建实例时开始,并在释放实例时结束。DbContext生成通过依......
  • vue2子组件切换,监听方法失效(监听多个字段)
    记录下问题本来是在父页面上放了多个子组件,利用单选按钮控制每个组件,选择了某个按钮,设置该组件控制字段为true,例如v-if="component"来控制销毁创建,根据component=true或者flase来控制子组件创建或者销毁后来发现子组件切换时,监听不生效,监听方法也加了immediate=true,当几个按钮......
  • 记录linux下无权限安装Anaconda以及R
    Anaconda2对应python2,Anaconda3对应python3。查看系统位数:getconfLONG_BIT。x86_64,表示是x86指令集的64扩展。1.下载清华镜像:https://mirror.tuna.tsinghua.edu.cn/help/anaconda/wgethttps://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda2-5.2.0-Linux-x86_64.s......
  • 【2023-05-23】有难同当
    20:00我们应该努力将玫瑰培育得更好,而不是想方设法将其变为百合。                                                 ——亚伯拉罕·马斯洛早上出门下大雨,是夏天的雨。......