我需要处理具有专门内容的ZIP文件,因此想要创建一个包装器,以便我可以使用类似
的内容with open(MySpecialFile('/path/to/file.zip', 'rb')) as msf:
<snip>
我已经知道如何实现__enter__
和__exit__
方法,但是我找不到任何关于如何使对象可以打开的文档。
我试图实现一个__open__
函数,希望python以这种方式应用open()方法。不幸的是,情况似乎并非如此:
>>> class Foo():
... def __open__(self):
... print('Opened!')
...
>>> with open(Foo()) as f:
... print('yay')
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: invalid file: <__main__.Foo object at 0x7f93b630ab00>
创建可以使用open()
打开的自定义对象的正确方法是什么?
答案 0 :(得分:2)
没有__open__
方法。相反,您应该创建一些实现file
API的东西。只要它实现了所有必要的方法,就会有一个简单的类。
然后你可以说:
with openMySpecialFile('/path/to/file.zip', 'rb') as msf:
...
其中openMySpecialFile()
是一个工厂函数,它构建在&#34;&#34;的实例中。上面并返回它。
答案 1 :(得分:2)
或者只是换open
:
class Foo(object):
def __init__(self, fpath, mode):
self.f = fpath
self.mode = mode
def __enter__(self):
print 'context begun'
self.file = open(self.f, self.mode)
return self.file
def __exit__(self, exc_type, exc_val, exc_tb):
print 'closing:', exc_type, exc_val, exc_tb
self.file.close()
def __str__(self):
return self.f
with Foo('file.spc', 'rb') as f:
print f.read()
>>>
context begun
filecontentsfilecontentsfilecontentsfilecontents
closing: None None None
>>>