code: def __getattr__(self, name):
      # avoid recursion https://nedbatchelder.com/blog/201010/surprising_getattr_recursion.html
      if name in ["components", "_parent"]:
          raise AttributeError(name)
      # delegates attributes to components
      for component in self.components:
          try:
              return getattr(component, name)
          except AttributeError:
              pass
      # delegates attributes to parent
      try:
          return getattr(self._parent, name)
      except AttributeError:
          pass
  
      raise AttributeError(
          f"{self.__class__.__name__} has no attribute {name}"
      )
  
imports: from icevision.imports import *
  from icevision.core import tasks
label_desc: Use image node_id 2 for calling the Composite obj's underlying member method code with example usage: obj.__getattr__(name) and returns: getattr, getattr