def get(self, *names, **kwargs):
        """ get(*names, key=None)
        Returns one or more :py:class:`TensorEnsemble` instances given by *names* using a deep
        lookup within all read models. Each returned tensor ensemble will have ``len(models)``
        tensors. If a model does not contain a specific tensor defined by a specific *name*, the
        associated ensemble tensor will contain a *None* for that model in its tensors. If *key* is
        not *None*, only the root tensors with that *key* are traversed.
        """
        # create empty tensor ensembles with our method
        tensor_ensembles = [TensorEnsemble([], self.method) for name in names]

        # loop over models, collect and add tensors
        for model in self.models:
            tensors = model.get(*names, **kwargs)
            if not isinstance(tensors, tuple):
                tensors = (tensors,)
            for i, t in enumerate(tensors if isinstance(tensors, tuple) else (tensors,)):
                tensor_ensembles[i].tensors.append(t)

        return tensor_ensembles[0] if len(names) == 1 else tuple(tensor_ensembles)