code: def __getattr__(self, attr):
      if attr in [
          "__wrapped_name__",
          "__wrapped__",
          "__wrapped_version__",
      ]:
          return self.__dict__.get(attr)
  
      if (
          not self.__dict__.get("__wrapped__")
          or self.__dict__.get("__wrapped_version__")
          != Session.api_version
      ):
          if not ApiServiceProxy._available_versions:
              services = self._import_module(
                  self._main_services_module, None
              )
              ApiServiceProxy._available_versions = sorted(
                  Version(name[1:].replace("_", "."))
                  for name in [
                      module_name
                      for _, module_name, _ in pkgutil.iter_modules(
                          services.__path__
                      )
                      if re.match(r"^v[0-9]+_[0-9]+$", module_name)
                  ]
              )
  
          # get the most advanced service version that supports our api
          version = [
              str(v)
              for v in ApiServiceProxy._available_versions
              if Session.check_min_api_version(v)
          ][-1]
          Session.api_version = version
          self.__dict__["__wrapped_version__"] = Session.api_version
          name = ".v{}.{}".format(
              version.replace(".", "_"),
              self.__dict__.get("__wrapped_name__"),
          )
          self.__dict__["__wrapped__"] = self._import_module(
              name, self._main_services_module
          )
  
      return getattr(self.__dict__["__wrapped__"], attr)
  
file_path: clearml/clearml/backend_api/api_proxy.py
imports: import importlib
  import pkgutil
  import re
  from typing import Any, Optional
  from .session import Session
  from ..utilities.check_updates import Version
label_desc: Use image node_id 2 for calling the ApiServiceProxy obj's underlying member method code with example usage: obj.__getattr__(attr) and returns: getattr, self