docs: def is_Quadratic(self):
          """Returns True if the expression is a polynomial with degree exactly 2 (read-only)."""
          if self.expression.is_Atom:
              return False
          if all((len(key.free_symbols) < 2 and (key.is_Add or key.is_Mul or key.is_Atom)
                  for key in self.expression.as_coefficients_dict().keys())):
              return False
          if self.expression.is_Add:
              terms = self.expression.args
              is_quad = False
              for term in terms:
                  if len(term.free_symbols) > 2:
                      return False
                  if term.is_Pow:
                      if not term.args[1].is_Number or term.args[1] > 2:
                          return False
                      else:
                          is_quad = True
                  elif term.is_Mul:
                      if len(term.free_symbols) == 2:
                          is_quad = True
                      if term.args[1].is_Pow:
                          if not term.args[1].args[1].is_Number or term.args[1].args[1] > 2:
                              return False
                          else:
                              is_quad = True
              return is_quad
          else:
              if isinstance(self.expression, sympy.Basic):
                  sympy_expression = self.expression
              else:
                  sympy_expression = sympy.sympify(self.expression)
              # TODO: Find a way to do this with symengine (Poly is not part of symengine, 23 March 2017)
              poly = sympy_expression.as_poly(*sympy_expression.atoms(sympy.Symbol))
              if poly is None:
                  return False
              else:
                  return poly.is_quadratic