标准库open
函数既可以作为函数使用:
f = open('file.txt')
print(type(f))
<type 'file'>
或作为上下文管理员:
with open('file.txt') as f:
print(type(f))
<type 'file'>
我正在尝试使用contextlib.closing
模仿此行为,其中File
是我的自定义文件I / O类:
def myopen(filename):
f = File(filename)
f.open()
return closing(f)
这可以像上下文管理器一样工作:
with myopen('file.txt') as f:
print(type(f))
<class '__main__.File'>
但当然如果我直接打电话,我会取回closing
对象而不是我的对象:
f = myopen(filename)
print(type(f))
<class 'contextlib.closing'>
那么,我如何实现myopen
以便它既可以作为上下文管理器又直接调用时返回我的File对象?
github上的完整工作示例: https://gist.github.com/1352573
答案 0 :(得分:13)
最简单的方法可能是自己实施__enter__
和__exit__
方法。这样的事情应该这样做:
class File(object):
# ... all the methods you already have ...
# context management
def __enter__(self):
return self
def __exit__(self, *exc_info):
self.close()
顺便说一句,在open
方法中执行__init__
方法的工作会更加惯用。