擅长:python、mysql、java
<p>实现<code>__getitem__</code>使您的类具有可移植性。观察:</p>
<pre><code>>>> class LegacyIterable(object):
... def __init__(self):
... self._list = ['a', 'b', 'c']
... def __getitem__(self, item):
... return self._list[item]
...
>>> x = LegacyIterable()
>>> for e in x:
... print e
...
a
b
c
</code></pre>
<p>如果类没有<code>__iter__</code>方法而是<code>__getitem__</code>方法,则Python在被迫这样做时,会从一个实例构造一个迭代器,该实例尝试通过<code>__getitem__</code>访问其元素。它从索引0开始,并在抛出<code>IndexError</code>时结束。你知道吗</p>
<p>但是,由于<code>LegacyIterable</code>实例没有<code>__len__</code>方法,因此它们还没有正式算作序列,<code>random.choice</code>会抱怨</p>
<pre><code>TypeError: object of type 'LegacyIterable' has no len()
</code></pre>
<p>然而,一旦我们给它一个<code>__len__</code>方法,实例就可以算作序列,根据它的文档,这就是<code>random.choice</code>想要的。你知道吗</p>
<pre><code>>>> LegacyIterable.__len__ = lambda x: 3
>>> choice(LegacyIterable())
'c'
</code></pre>
<blockquote>
<p>choice(self, seq) method of random.Random instance<br/>
Choose a random element from a non-empty sequence.</p>
</blockquote>