63 lines
1.3 KiB
Python
63 lines
1.3 KiB
Python
class Resource():
|
||
def __enter__(self):
|
||
print('===connect to resource===')
|
||
return self
|
||
|
||
def __exit__(self, exc_type, exc_val, exc_tb):
|
||
print('===close resource connection===')
|
||
print(exc_type)
|
||
print(exc_val)
|
||
print(exc_tb)
|
||
return True
|
||
|
||
def operate(self):
|
||
1/0
|
||
|
||
with Resource() as res:
|
||
res.operate()
|
||
|
||
|
||
import contextlib
|
||
|
||
@contextlib.contextmanager
|
||
def open_func(file_name):
|
||
# __enter__方法
|
||
print('open file:', file_name, 'in __enter__')
|
||
file_handler = open(file_name, 'r')
|
||
|
||
try:
|
||
yield file_handler
|
||
except Exception as exc:
|
||
# deal with exception
|
||
print('the exception was thrown')
|
||
finally:
|
||
print('close file:', file_name, 'in __exit__')
|
||
file_handler.close()
|
||
|
||
return
|
||
|
||
with open_func('mytest.txt') as file_in:
|
||
for line in file_in:
|
||
1/0
|
||
print(line)
|
||
|
||
|
||
import contextlib
|
||
|
||
@contextlib.contextmanager
|
||
def open_func(file_name):
|
||
# __enter__方法
|
||
print('open file:', file_name, 'in __enter__')
|
||
file_handler = open(file_name, 'r')
|
||
|
||
# 【重点】:yield
|
||
yield file_handler
|
||
|
||
# __exit__方法
|
||
print('close file:', file_name, 'in __exit__')
|
||
file_handler.close()
|
||
return
|
||
|
||
with open_func('mytest.txt') as file_in:
|
||
for line in file_in:
|
||
print(line) |