docstr: Get X_normalization_data by attribute
docstr_tok: ["Get","X_normalization_data","by","attribute"]
code: def __getattr__(self, attr):
      """Get X_normalization_data by attribute"""
      normalization_data_suffix = "_normalization_data"
      if attr.endswith(normalization_data_suffix):
          assert self._normalization_data_map is not None, (
              f"Trying to access {attr} but normalization_data_map "
              "has not been set. Did you run `setup()`"
          )
          normalization_key = attr[: -len(normalization_data_suffix)]
          normalization_data = self._normalization_data_map.get(
              normalization_key, None
          )
          if normalization_data is None:
              raise AttributeError(
                  f"normalization key `{normalization_key}` is unavailable. "
                  f"Available keys are: {self._normalization_data_map.keys()}."
              )
          return normalization_data
  
      raise AttributeError(f"attr {attr} not available {type(self)}")
  
imports: import abc
  import logging
  import pickle
  from typing import Dict, List, NamedTuple, Optional, Tuple
  from reagent.core.parameters import NormalizationData
  from reagent.data.data_fetcher import DataFetcher
  from reagent.data.oss_data_fetcher import OssDataFetcher
  from reagent.preprocessing.batch_preprocessor import BatchPreprocessor
  from reagent.workflow.types import Dataset, ReaderOptions, ResourceOptions, RewardOptions, TableSpec
  from .reagent_data_module import ReAgentDataModule
label_desc: Use image node_id 9 for calling the ManualDataModule obj's underlying member method code with example usage: obj.__getattr__(attr) and returns: normalization_data