In [26]:
d1 = { 'a': 1, 'b': 52 }

In [47]:
class D(object):
    def __iter__(self):
        print 'calling iter'
        yield 'a'
        yield 'b'
    def keys(self):
        print 'calling keys'
        return ['a', 'b']
    def items(self):
        print 'calling items'
        return [('a', 1), ('b', 52)]
    def __len__(self):
        print 'calling len'
        return 2
    def __contains__(self, key):
        print 'calling contains'
        return key in ['a', 'b']
    def __getitem__(self, key):
        if key == 'a':
            return 1
        if key == 'b':
            return 52
        raise KeyError(key)

In [49]:
d2 = D()

d2['c']


---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-49-0543e3b414d2> in <module>()
      1 d2 = D()
      2 
----> 3 d2['c']

<ipython-input-47-758e2d48aa45> in __getitem__(self, key)
     21         if key == 'b':
     22             return 52
---> 23         raise KeyError(key)

KeyError: 'c'

In [80]:
a1 = [2,3,5,7,11,13]

class A(object):
    def __init__(self):
        self.a = [2,3,5,7,11,13]
    def __contains__(self, value):
        return value in self.a
    def __len__(self):
        return len(self.a)
    def __iter__(self):
        for v in self.a:
            yield v
    def __getitem__(self, index):
        print index
        return self.a[index]

In [84]:
a2 = A()

s = slice(2,5)
a1[s]


Out[84]:
[5, 7, 11]