Python中with的用法,python中with的作用
一、文件操作#单车
f=打开(文件名)
f .写入()
上面代码的F.close()问题:
(1)直接打开()需要手动关闭,很容易忘记关闭。
(2)文件操作异常时,程序提前离开,但不进行文件关闭操作。
#汽车
尝试:
f=打开( xxx )
F.write() #文件操作
除了:
做某事
最后:
F.close()有很完善的函数,但是代码是那么的多余和愚蠢。
#特斯拉
用open(xxx )作为f:
F.write() #文件操作A用代码块直接解决一切。无论如何退出代码块,文件都会自动关闭。
问题来了,
为什么可以用自动关闭文件?
为什么即使文件操作出现异常,with也能正常关闭文件?带有的语句返回一个对象作为原始打开。有什么区别?
二。with Principle __enter__()方法:计算完紧跟在with后面的语句后,调用返回对象的__enter__()方法,该方法的返回值将赋给后面的变量as。
__exit__()方法:当执行完with之后的所有代码块时,会调用前面返回对象的__exit__()方法。
类测试(对象):
def __enter__(自身):
打印(执行了__enter__方法)
Return 回车返回的内容
def __exit__(自身,类型,值,跟踪):
打印(执行了__exit__方法)
使用测试()作为测试:
打印(测试:,测试)运行结果:
__enter__方法已执行。
测试返回的内容:输入
执行了__exit__方法执行过程:
执行下面的Test()语句,并执行enter()。
enter()的返回值在as之后返回给变量test。
用语句执行中间代码块打印变量测试,
执行完中间代码块后,执行__exit__()。
推断:自动关闭文件是在__exit__()中调用文件关闭方法
第三,支持with语法的类open的实现,因为double down enter和double down exit的内部实现。
如果希望类与一起使用,则必须支持with语法,即double down enter和double down exit的内部实现,如下所示:
导入系统
导入时间
导入线程
类别微调器:
忙=假
延迟=0.5
@静态方法
def spinning_cursor():
而1:
对于 /-\\ 中的光标:
产出光标
def __init__(self,delay=None):
打印(111)
self . spinner _ generator=self . spinning _ cursor()
如果延迟和浮动(延迟):
自我延迟=延迟
定义微调器_任务(自身):
自我忙碌时:
打印(333)
sys . stdout . write(next(self . spinner _ generator))# IO
打印(999)
sys.stdout.flush()
time.sleep(自我延迟)#IO
打印(666)
sys.stdout.write(\b )
sys.stdout.flush()
打印(777)
def __enter__(自身):
打印(222)
self.busy=True
穿线。线程(target=self.spinner_task)。开始()
def __exit__(自身,异常,值,tb):
self.busy=False
时间.睡眠(自我延迟)
如果异常不为无:
返回False
使用Spinner():
打印(444)
t1=time.time()
while time.time()-t1 2:
打印(555)
time.sleep(1) #io
打印(“完成了”)
11 #执行__初始化_ _
22 #执行__回车_ _
33 #执行任务spinner_task线程1
44 999 #遇到write的io,执行另一个线程2。线程1的io结束后,立即切换回来,继续执行线程1 的输出
55 #线程1遇到sleep的io立即切换线程2,进入sleep和io,切换回线程1。
666
777
333
/999
结束
555
666
777
333
-999
666
777
333
\999
Finished # time大于2,当线程2结束时,即代码块结束时,开始执行__exit__,并设置退出标志。
666
77 #线程1的输出结束,遇到退出信号就结束了。每个人都完成结果分析。
转载请联系作者授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。