code: def igetattr(self, name, context=None):
          
          if not context:
              context = contextmod.InferenceContext()
          try:
              # avoid recursively inferring the same attr on the same class
              if context.push((self._proxied, name)):
                  raise exceptions.InferenceError(
                      message="Cannot infer the same attribute again",
                      node=self,
                      context=context,
                  )
  
              # XXX frame should be self._proxied, or not ?
              get_attr = self.getattr(name, context, lookupclass=False)
              yield from _infer_stmts(
                  self._wrap_attr(get_attr, context), context, frame=self
              )
          except exceptions.AttributeInferenceError as error:
              try:
                  # fallback to class.igetattr since it has some logic to handle
                  # descriptors
                  # But only if the _proxied is the Class.
                  if self._proxied.__class__.__name__ != "ClassDef":
                      raise exceptions.InferenceError(**vars(error)) from error
                  attrs = self._proxied.igetattr(name, context, class_context=False)
                  yield from self._wrap_attr(attrs, context)
              except exceptions.AttributeInferenceError as error:
                  raise exceptions.InferenceError(**vars(error)) from error
docs: inferred getattr