将缓存委托给一个StringIO
对象(代码未经测试,只是为了给出想法):
import urllib
from io import StringIO
class CachedRequest(object):
def __init__(self, url):
self._request = urllib.urlopen(url)
self._content = None
def __getattr__(self, attr):
# if attr is not defined in CachedRequest, then get it from
# the request object.
return getattr(self._request, attr)
def read(self):
if self._content is None:
content = self._request.read()
self._content = StringIO()
self._content.write(content)
self._content.seek(0)
return content
else:
return self._content.read()
def seek(self, i):
self._content.seek(i)
如果代码实际上需要一个真实的Request
对象(即isinstance
检查类型的调用),那么子类Request
,你甚至不必实现__getattr__
.
请注意,函数可能会检查确切的类(在这种情况下,您不能什么都不做),或者,如果它是用 C 编写的,则使用 C/API 调用来调用方法(在这种情况下,被覆盖的方法不会是称为)。