python 上下文管理器

python上下文管理器

  1. 简介

    1
    2
    3
    * 规定对象的使用范围,超越范围则"采取处理"
    格式: with...as.. 代码块
    * 任何定义了"__enter__()"和"__exit__()"方法的对象都可以用于上下文管理器
  2. 示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    //普通文件打开方式
    [root@dev test]# cat 1.py
    #!/usr/bin/env python
    f = open('new.text','w')
    print(f.closed)
    f.write('Hello,world!')
    f.close()
    print(f.closed)

    [root@dev test]# python 1.py
    False
    True

    //使用上下文管理器打开文件
    [root@dev test]# cat 2.py
    #!/usr/bin/env python
    with open('new.txt','w') as f:
    print(f.closed)
    f.write('haha')
    print(f.closed)

    [root@dev test]# python 2.py
    False
    True

    //自定义上下文管理器
    [root@dev test]# cat 3.py
    #!/usr/bin/env python
    class Vow(object):
    def __init__(self,text):
    self.text = text

    def __enter__(self):
    self.text = "enter : " + self.text
    return self # 注意,这里返回的是 对象!!!

    def __exit__(self,exc_type,exc_value,traceback):
    self.text = self.text + ' now __exit__ !'

    with Vow('hello') as myvow:
    print(myvow.text) # 此时进入的是__enter__()
    print(myvow.text) # 此时进入的是__exit__()

    [root@dev test]# python 3.py
    enter : hello
    enter : hello now __exit__ !
  3. 上下文管理器理解

    1
    2
    3
    4
    5
    6
    7
    8
    with EXPR as VAR:
    相当于:
    VAR = EXPR
    VAR = VAR.__enter__()
    try:
    BLOCK
    finally:
    VAR.__exit__()