class_docstr: Metaclass for :class:`Op` classes.
  
  This weakly caches op instances. Caching strategy is to key on
  ``args[arity:],kwargs`` and to weakly retain values. Caching requires all
  non-funsor args to be hashable; for non-hashable args, implement a derived
  metaclass with custom :meth:`hash_args_kwargs` method.
code: def __call__(cls, *args, **kwargs):
      args = (None,) * cls.arity + args
      bound = cls.signature.bind_partial(*args, **kwargs)
      bound.apply_defaults()
      args = bound.args[cls.arity :]
      kwargs = bound.kwargs
      key = cls.hash_args_kwargs(args, kwargs)
      op = cls._instance_cache.get(key, None)
      if op is None:
          op = cls._instance_cache[key] = super().__call__(
              *args, **kwargs
          )
      return op
  
imports: import contextlib
  import functools
  import inspect
  import weakref
  from collections import OrderedDict
  from funsor.registry import PartialDispatcher
  from funsor.util import methodof
label_desc: Use image node_id 3 for calling the OpMeta obj's underlying member method code with example usage: obj.__call__(cls) and returns: op