前言

with表达式其实是try-finally的简写形式。但是又不是全相同。

格式

"""

格式

with context [as var]:

pass

"""

其中的context是一个表达式,返回的是一个对象,var用来保存context表达式返回的对象,可以有单个或者多个返回值。

with open('1.txt') as f:

print(f.read())

print(f.closed)

表达式open('1.txt')返回是一个_io.TextIOWrapper 类型的变量用f接受到。在with语句块中就可以使用这个变量操作文件。执行with这个结构之后。f会自动关闭。相当于自带了一个finally。

image.png

但是with本身并没有异常捕获的功能,但是如果发生了运行时异常,它照样可以关闭文件释放资源。

这个例子可以看出with没有捕获异常的功能。

with open('2.txt') as f:

print(f.read())

print(f.closed)

image.png

这个例子可以看出with发生了异常也会关闭程序。

try:

with open('1.txt') as f2:

print(f2.read())

f2.seek(-5,os.SEEK_SET)

except ValueError as e:

print("error")

print(f2.closed)

image.png

原理

"""

with 语句实质是上下文管理。

1、上下文管理协议。包含方法__enter__() 和 __exit__(),支持该协议对象要实现这两个方法。

2、上下文管理器,定义执行with语句时要建立的运行时上下文,负责执行with语句块上下文中的进入与退出操作。

3、进入上下文的时候执行__enter__方法,如果设置as var语句,var变量接受__enter__()方法返回值。

4、如果运行时发生了异常,就退出上下文管理器。调用管理器__exit__方法。

"""

自定义类

自定义类必须包含上述几个方法才能正确使用with关键字。

class Mycontex(object):

def __init__(self,name):

self.name=name

def __enter__(self):

print("进入enter")

return self

def do_self(self):

print(self.name)

def __exit__(self,exc_type,exc_value,traceback):

print("退出exit")

print(exc_type,exc_value)

if __name__ == '__main__':

with Mycontex('test') as mc:

mc.do_self()

image.png

下面我们故意加一个NameError

image.png

即使程序发生了错误,python解释器终止了我们的程序,但是我们的类 还是顺利关闭了。

应用场景

1、文件操作。2、进程线程之间互斥对象。3、支持上下文其他对象

python用于声明类的关键字_python的with关键字相关推荐

  1. python定义一个类和子类_Python面向对象class类属性及子类用法分析

    本文实例讲述了Python面向对象class类属性及子类用法.分享给大家供大家参考,具体如下: class类属性 class Foo(object): x=1.5 foo=Foo() print fo ...

  2. python什么是类和对象_python的类和对象(1)

    类和对象 现在这年头,怎么哪里都有对象?街上看了一路手拉手,回来学习还要看到"对象". 是不是学会了对象,就有对象了? 1.定义: 百度解释: 对象是对客观事物的抽象,类是对对象的 ...

  3. python用于标识类方法的是_Python类的设计与使用

    28 类的基础--设计.使用 上一章说过,类是事物功能和属性的抽象,对象是类的实例化.就像人人都知道小汽车可以干什么什么的,但光想小汽车如何好是没有用的,得开车或坐才能感受到小汽车的好.人脑里的小汽车 ...

  4. python语言的保留字有哪些_Python保留字(关键字)一览表

    与 C.C++.Java.C# 等语言不同,Python 没有定义常量的关键字,意即 Python 中没有常量的概念.为了实现与其他语言中功能相近的常量,可以使用 Python 面向对象的方法编写一个 ...

  5. python标识符和关键字_Python标识符和关键字资料解析

    标识符和关键字都是之中具有某种意义的标记和称谓,就像人的外号一样.所谓的标识符就是代码的分号.单引号.双引号等等就是标识符,而代码中的if.for等等就是关键字. python语言的标识符使用规则和C ...

  6. python函数和类的区别_Python中类中的方法还有区别?

    上一篇,我们讲到Python类中的属性是有区别的,爱思考的小伙伴们可能就会问了,Python中的方法是不是也有区别呢?是的,而且Python中的方法区别更大,让我们来看看吧~ Python类中的三种方 ...

  7. python模块和类和方法_Python类、模块、包的区别

    类 类的概念在许多语言中出现,很容易理解.它将数据和操作进行封装,以便将来的复用. 模块 模块,在Python可理解为对应于一个文件.在创建了一个脚本文件后,定义了某些函数和变量.你在其他需要这些功能 ...

  8. python里面的类和对象_Python中类和对象在内存中是如何保存?

    类以及类中的方法在内存中只有一份,而根据类创建的每一个对象都在内存中需要存一份,大致如下图: 如上图所示,根据类创建对象时,对象中除了封装 name 和 age 的值之外,还会保存一个类对象指针,该值 ...

  9. python定义一个类和子类_Python定义类、定义子类以及super()函数的使用

    代码实验展示: # 继承关系 object -> Person -> Student -> SchoolBoy # python2的语法: # class Person(object ...

最新文章

  1. 数据科学究竟是什么?
  2. SQLITE3根据需求查询回不同的数据类型简单记录
  3. “MIDI机器狗”的木马正在疯狂传播
  4. CV之CycleGAN:CycleGAN算法相关思路配图、论文集合
  5. 设计模式(二) 工厂模式
  6. 简单查找,如果找到返回下标,如果找不到返回-1
  7. 解密HLS中的AES加密
  8. Java——多线程(线程安全问题)
  9. JQuery.autocomplete扩展功能:实现多列自动提示
  10. 甲骨文推出MySQL Fabric,简化MySQL的高可用性与可扩展性
  11. homebrew安装
  12. 平板电脑应用_机房巡检AI机器人是啥,工业平板电脑的应用如何体现
  13. origin 快捷键
  14. Unity常用图片格式说明
  15. 基于决策树算法的银行营销预测
  16. 三跨考生准备考研复试(机试)之路(日记版)
  17. 简述华为的鸿蒙操作系统的结构,华为鸿蒙操作系统今日重磅发布
  18. 什么 是模型的记忆力!
  19. 小说里的编程 【连载之十二】元宇宙里月亮弯弯
  20. java斗地主代码_基于java实现斗地主代码实例解析

热门文章

  1. Python要点总结,我使用了100个小例子!
  2. ReportViewer教程(15)-矩阵报表-5
  3. Invoke and BeginInvoke BeginInvoke和EndInvoke方法 (转)2
  4. 每天进步一点点《PCA的简要学习》
  5. scikit-learn中随机森林使用详解
  6. python语句块规范_Python基础语法——代码规范判断语句循环语句
  7. 浏览器怎么扫描二维码_让你的chrome浏览器开启自动翻译,浏览任何语言不是梦...
  8. leetcode —— 959. 由斜杠划分区域
  9. 吴恩达深度学习 —— 4.7 参数 vs. 超参数
  10. 用simulink分析傅里叶变换、短时傅里叶变换和小波变换