Python with 工作原理、装饰器、回收机制、内存管理机制、拷贝、作用域等( 二 )


02、with工作原理
with 语句适用于对资源进行访问的场合 , 确保不管使用过程中是否发生异常都会执行必要的“清理”操作 , 释放资源 , 比如文件使用后自动关闭/线程中锁的自动获取和释放等 。
class WithTest:def __enter__(self):print("进入了".center(50, "*"))"""exception: 异常exception_type : 异常类型exception_value : 异常的值(原因)exception_traceback : 异常发生的位置(回溯、追溯)"""def __exit__(self, exc_type, exc_val, exc_tb):print("异常类型:", exc_type)print("异常的值:", exc_val)print("异常发生的位置:", exc_tb)print("退出了".center(50, "*"))with WithTest() as w:print("运行前".center(50, "*"))print(10 / 0)print("运行后".center(50, "*"))
Traceback (most recent call last):File "C:\Users\16204\PycharmProjects\pythonProject\file_test\with_user.py", line 19, in print(10 / 0)ZeroDivisionError: division by zero***********************进入了***********************************************运行前************************异常类型: 异常的值: division by zero异常发生的位置: ***********************退出了************************Process finished with exit code 1
with 工作原理
(1)紧跟with后面的语句被求值后 , 返回对象的“–enter–()”方法被调用 , 这个方法的返回值将被赋值给as后面的变量;
(2)当with后面的代码块全部被执行完之后 , 将调用前面返回对象的“–exit–()”方法 。
with工作原理代码示例:
class Sample:def __enter__(self):print("in __enter__")return "唤醒手腕"def __exit__(self, exc_type, exc_val, exc_tb):print("in __exit__")def get_sample():return Sample()with get_sample() as sample:print("Sample: ", sample)# in __enter__# Sample: 唤醒手腕# in __exit__
可以看到 , 整个运行过程如下:
(1)enter()方法被执行;
(2)enter()方法的返回值 , 在这个例子中是”唤醒手腕” , 赋值给变量;
(3)执行代码块 , 打印变量的值为”唤醒手腕”;
(4)exit()方法被调用;
实际上 , 在with后面的代码块抛出异常时 , exit()方法被执行 。开发库时 , 清理资源 , 关闭文件等操作 , 都可以放在exit()方法中 。
总之 , with - as表达式极大的简化了每次写的工作 , 这对代码的优雅性是有极大帮助的 。
如果有多项 , 可以这样写:
with open('1.txt') as f1, open('2.txt') asf2:do something
我们自己的类也可以进行with的操作:
class A:def __enter__(self):print 'in enter'def __exit__(self, e_t, e_v, t_b):print 'in exit'with A() as a:print 'in with'# in enter# in with# in exit
exit()方法中有3个参数 ,  、 、 , 这些参数在异常处理中相当有用 。:错误的类型 , :错误类型对应的值 , :代码中错误发生的位置 。
03、文件操作常见语法’
换行的操作:在系统默认是"/r/n" , 在Linux操作系统中采用的是"/n" , 在Mac操作中默认采用的是"/r" , 在中只有加‘/n’就行 , 操作系统会帮我们转义成对于系统的换行符 。
为何要用文件?
用户 / 应用程序可以通过文件将数据永久保存的硬盘中即操作文件就是操作硬盘 。