class_docstr: Handler dispatcher for associative operators
  
  .. notes::
     This approach is experimental, and can be replaced or deleted in the future.
     See https://github.com/sympy/sympy/pull/19463.
  
  Explanation
  ===========
  
  If arguments of different types are passed, the classes which handle the operation for each type
  are collected. Then, a class which performs the operation is selected by recursive binary dispatching.
  Dispatching relation can be registered by ``register_handlerclass`` method.
  
  Priority registration is unordered. You cannot make ``A*B`` and ``B*A`` refer to
  different handler classes. All logic dealing with the order of arguments must be implemented
  in the handler class.
  
  Examples
  ========
  
  >>> from sympy import Add, Expr, Symbol
  >>> from sympy.core.add import add
  
  >>> class NewExpr(Expr):
  ...     @property
  ...     def _add_handler(self):
  ...         return NewAdd
  >>> class NewAdd(NewExpr, Add):
  ...     pass
  >>> add.register_handlerclass((Add, NewAdd), NewAdd)
  
  >>> a, b = Symbol('a'), NewExpr()
  >>> add(a, b) == NewAdd(a, b)
  True
docstr: Parameters
  ==========
  
  *args :
      Arguments which are operated
docstr_tok: ["Parameters","==========","*","args",":","Arguments","which","are","operated"]
code: def __call__(self, *args, _sympify=True, **kwargs):
      """
      Parameters
      ==========
  
      *args :
          Arguments which are operated
      """
      if _sympify:
          args = tuple(map(_sympify_, args))
      handlers = frozenset(map(self._handlergetter, args))
  
      # no need to sympify again
      return self.dispatch(handlers)(*args, _sympify=False, **kwargs)
  
imports: from __future__ import annotations
  from operator import attrgetter
  from collections import defaultdict
  from sympy.utilities.exceptions import sympy_deprecation_warning
  from .sympify import _sympify, sympify
  from .basic import Basic
  from .cache import cacheit
  from .sorting import ordered
  from .logic import fuzzy_and
  from .parameters import global_parameters
  from sympy.utilities.iterables import sift
  from sympy.multipledispatch.dispatcher import Dispatcher, ambiguity_register_error_ignore_dup, str_signature, RaiseNotImplementedError
label_desc: Use image node_id 4 for calling the AssocOpDispatcher obj's underlying member method code with example usage: obj.__call__() and returns: self