Python中with的用法,python中with的作用

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: