class_docstr: Abstract base class for all mathematical operations on ground terms.
  
  Ops take ``arity``-many leftmost positional args that may be funsors,
  followed by additional non-funsor args and kwargs. The additional args and
  kwargs must have default values.
  
  When wrapping new backend ops, keep in mind these restrictions, which may
  require you to wrap backend functions before making them into ops:
  
  - Create new ops only by decoraing a default implementation with
    ``@UnaryOp.make``, ``@BinaryOp.make``, etc.
  - Register backend-specific implementations via ``@my_op.register(type1)``,
    ``@my_op.register(type1, type2)`` etc for arity 1, 2, etc. Patterns may
    include only the first ``arity``-many types.
  - Only the first ``arity``-many arguments may be funsors. Remaining args
    and kwargs must all be ground Python data.
  
  :cvar int ~.arity: The number of funsor arguments this op takes. Must be
      defined by subclasses.
  :param \*args:
  :param \*\*kwargs: All extra arguments to this op, excluding the arguments
      up to ``.arity``,
code: def __repr__(self):
      return "ops." + self.__name__
  
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 6 for calling the Op obj's underlying member method code with example usage: obj.__repr__() and returns: unknown