<p>这是Python的“<a href="https://en.wikipedia.org/wiki/Duck_typing#In_Python" rel="nofollow">duck typing</a>”方法的一个主要示例。为了解释这一点,让我们首先从程序员的角度考虑一下文件实际上是什么:</p>
<ul>
<li>文件是可以读取并向程序传递字节的内容。在</li>
<li>文件有一个长度(在文件的生命周期中可能会改变,但在任何时间点,它都有一个长度)。在</li>
<li>有些文件可以写入,但有些不能写入:CD/DVD/Bluray上的文件是真正的“只读”文件,但仍然是一个文件。在</li>
</ul>
<p>示例中的代码提供了一个<code>class</code>,它实现了一个<code>read</code>方法,最后返回字节,因此可以像Python中的普通文件对象一样对待它(如果它有一个<code>read</code>方法,那么它就是一个文件!)在</p>
<p>考虑这个最小的例子:</p>
<pre><code>class SimpleFile(object):
def read(self):
return b"a,b,c,d"
class SimpleFileUser(object):
def __init__(self, f):
self.f = f
def use_file(self):
print(self.f.read())
sf = SimpleFile()
sfu_1 = SimpleFileUser(sf)
sfu_1.use_file()
real_file = open('test.txt')
sfu_2 = SimpleFileUser(real_file)
sfu_2.use_file()
</code></pre>
<p>类<code>SimpleFileUser</code>可以将任何内容用作实现<code>read</code>方法的文件。它可以是<code>open</code>返回的file对象,也可以是<code>SimpleFile</code>类的实例,因为这个类还提供了一个<code>read</code>方法。在</p>
<p>类<code>MyFileWrapper</code>实现了允许您访问可通过HTTP访问的文件的函数。因此,它提供函数<code>tell</code>文件中的当前位置,<code>seek</code>(跳转)到文件中的另一个位置,以及<code>read</code>文件中的实际数据。本例中的文件是通过HTTP访问的。如何调用方法取决于<code>ZipFile</code>。如果在原始代码中使用<code>DEBUG</code>变量,您可以看到<code>ZipFile</code>实际在做什么来读取数据。在</p>
<p><code>offset</code>和<code>whence</code>只是<code>seek</code>函数的参数。{a2:}是仿照a2建模的。文件/HTTP可访问内容中的当前位置存储在成员变量<code>self.position</code></p>
<p>定义了<code>seek</code>和<code>tell</code>方法,通过将文件指针设置到文件末尾(<code>seek(2, 0)</code>)并获得文件指针位置(<code>tell</code>),使<code>zipfile</code>类能够确定文件大小。在</p>