code: def spin(self):
          
          # NB: The existence of the _spin property implies that it is up to date, methods that
          # invalidate it will erase the property
          try:
              spin = self._spin
              if spin is not None:
                  return spin
          except AttributeError:
              pass
  
          if self.vartype is Vartype.SPIN:
              self._spin = spin = self
          else:
              self._counterpart = self._spin = spin = self.change_vartype(Vartype.SPIN, inplace=False)
  
              # we also want to go ahead and set spin.binary to refer back to self
              spin._binary = self
  
          return spin
docs: :class:`.BinaryQuadraticModel`: An instance of the Ising model subclass
          of the :class:`.BinaryQuadraticModel` superclass, corresponding to
          a binary quadratic model with spins as its variables.
  
          Enables access to biases for the spin-valued binary quadratic model
          regardless of the :class:`vartype` set when the model was created.
          If the model was created with the :attr:`.binary` vartype,
          the Ising model subclass is instantiated upon the first use of the
          :attr:`.spin` property and used in any subsequent reads.
  
          Examples:
              This example creates a QUBO model and uses the :attr:`.spin` property
              to instantiate the corresponding Ising model.
  
              >>> import dimod
              ...
              >>> bqm_qubo = dimod.BinaryQuadraticModel({0: -1, 1: -1}, {(0, 1): 2}, 0.0, dimod.BINARY)
              >>> bqm_spin = bqm_qubo.spin
              >>> bqm_spin   # doctest: +SKIP
              BinaryQuadraticModel({0: 0.0, 1: 0.0}, {(0, 1): 0.5}, -0.5, Vartype.SPIN)
              >>> bqm_spin.spin is bqm_spin
              True
  
          Note:
              Methods like :meth:`.add_variable`, :meth:`.add_variables_from`,
              :meth:`.add_interaction`, etc. should only be used on the base model.