def __getattr__(self, key):
        """
        Gets attribute by ``key``.
        Firstly, looks at the ``origin`` for the appropriate ``key``.
        If none founds - looks at the wrappers attributes.
        If could not found anything - returns ``None``.

        Args:
            key: attribute key

        Returns:
            attribute value
        """
        some_default_value = "_no_attr_found_"
        value = self.origin.__dict__.get(key, some_default_value)
        # value = getattr(self.origin, key, None)
        if value != some_default_value:
            return value
        value = self.__dict__.get(key, some_default_value)
        # value = getattr(self, key, None)
        if value != some_default_value:
            return value
        return None

        Gets attribute by ``key``.
        Firstly, looks at the ``origin`` for the appropriate ``key``.
        If none founds - looks at the wrappers attributes.
        If could not found anything - returns ``None``.

        Args:
            key: attribute key

        Returns:
            attribute value
        
catalyst/data/loader.py