class_docstr: Wrapper around cupy.ndarray
  Supports cupy.ndarray.__init__ as well as,
  gets initialized with a cupy ndarray.
docstr: Catches attributes corresponding to ndarray.
  
  Args:
      attr (str): Attribute of ndarray class.
  
  Returns:
      (_RecursiveAttr object, self._array.attr):
      Returns_RecursiveAttr object with numpy_object, cupy_object.
      Returns self._array.attr if attr is not callable.
docstr_tok: ["Catches","attributes","corresponding","to","ndarray",".","Args",":","attr","(","str",")",":","Attribute","of","ndarray","class",".","Returns",":","(","_RecursiveAttr","object",",","self._array.attr",")",":","Returns_RecursiveAttr","object","with","numpy_object",",","cupy_object",".","Returns","self._array.attr","if","attr","is","not","callable","."]
code: def __getattr__(self, attr):
      """
      Catches attributes corresponding to ndarray.
  
      Args:
          attr (str): Attribute of ndarray class.
  
      Returns:
          (_RecursiveAttr object, self._array.attr):
          Returns_RecursiveAttr object with numpy_object, cupy_object.
          Returns self._array.attr if attr is not callable.
      """
  
      if self._supports_cupy:
          cupy_object = getattr(cp.ndarray, attr, None)
          numpy_object = getattr(np.ndarray, attr)
      else:
          cupy_object = None
          numpy_object = getattr(self._numpy_array.__class__, attr)
  
      if not callable(numpy_object):
          if self._supports_cupy:
              if self._remember_numpy:
                  self._update_cupy_array()
              return getattr(self._cupy_array, attr)
          return getattr(self._numpy_array, attr)
  
      return _RecursiveAttr(numpy_object, cupy_object, self)
  
imports: import types
  import numpy
  import cupy
  from cupyx.fallback_mode import notification
label_desc: Use image node_id 6 for calling the ndarray obj's underlying member method code with example usage: obj.__getattr__(attr) and returns: _RecursiveAttr, getattr, getattr