def _getrow(self, idx):
    return self.m[idx]

def __getitem__(self, idx):
    if isinstance(idx, (numbers.Integral, slice)):
        return self._getrow(idx)
rowidx, colidx = idx
if isinstance(rowidx, numbers.Integral):
    return self._getrow(rowidx)[colidx]
else:
    return [row[colidx] for row in self._getrow(rowidx)]
Реализация 2D-нарезки в Python