class_docstr: Join/meet operations of an algebraic lattice[1].
  
  Explanation
  ===========
  
  These binary operations are associative (op(op(a, b), c) = op(a, op(b, c))),
  commutative (op(a, b) = op(b, a)) and idempotent (op(a, a) = op(a) = a).
  Common examples are AND, OR, Union, Intersection, max or min. They have an
  identity element (op(identity, a) = a) and an absorbing element
  conventionally called zero (op(zero, a) = zero).
  
  This is an abstract base class, concrete derived classes must declare
  attributes zero and identity. All defining properties are then respected.
  
  Examples
  ========
  
  >>> from sympy import Integer
  >>> from sympy.core.operations import LatticeOp
  >>> class my_join(LatticeOp):
  ...     zero = Integer(0)
  ...     identity = Integer(1)
  >>> my_join(2, 3) == my_join(3, 2)
  True
  >>> my_join(2, my_join(3, 4)) == my_join(2, 3, 4)
  True
  >>> my_join(0, 1, 4, 2, 3, 4)
  0
  >>> my_join(1, 2)
  2
  
  References
  ==========
  
  .. [1] https://en.wikipedia.org/wiki/Lattice_%28order%29
code: def __new__(cls, *args, **options):
      args = (_sympify_(arg) for arg in args)
  
      try:
          # /!\ args is a generator and _new_args_filter
          # must be careful to handle as such; this
          # is done so short-circuiting can be done
          # without having to sympify all values
          _args = frozenset(cls._new_args_filter(args))
      except ShortCircuit:
          return sympify(cls.zero)
      if not _args:
          return sympify(cls.identity)
      elif len(_args) == 1:
          return set(_args).pop()
      else:
          # XXX in almost every other case for __new__, *_args is
          # passed along, but the expectation here is for _args
          obj = super(AssocOp, cls).__new__(cls, *ordered(_args))
          obj._argset = _args
          return obj
  
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 1 for calling the LatticeOp obj's underlying member method code with example usage: obj.__new__(cls) and returns: sympify, sympify, set, obj