class_docstr: Abstract base class for all pathway classes to inherit from.
  
  Notes
  =====
  
  Instances of this class cannot be directly instantiated by users. However,
  it can be used to created custom pathway types through subclassing.
class_docstr_tok: ["Abstract","base","class","for","all","pathway","classes","to","inherit","from",".","Notes","=====","Instances","of","this","class","can","not","be","directly","instantiated","by","users",".","However",",","it","can","be","used","to","created","custom","pathway","types","through","subclassing","."]
code: def attachments(self, attachments):
      if hasattr(self, "_attachments"):
          msg = (
              f"Can't set attribute `attachments` to {repr(attachments)} "
              f"as it is immutable."
          )
          raise AttributeError(msg)
      if len(attachments) != 2:
          msg = (
              f"Value {repr(attachments)} passed to `attachments` was an "
              f"iterable of length {len(attachments)}, must be an iterable "
              f"of length 2."
          )
          raise ValueError(msg)
      for i, point in enumerate(attachments):
          if not isinstance(point, Point):
              msg = (
                  f"Value {repr(point)} passed to `attachments` at index "
                  f"{i} was of type {type(point)}, must be {Point}."
              )
              raise TypeError(msg)
      self._attachments = tuple(attachments)
  
imports: from abc import ABC, abstractmethod
  from sympy.core.singleton import S
  from sympy.physics.mechanics.loads import Force
  from sympy.physics.mechanics.wrapping_geometry import WrappingGeometryBase
  from sympy.physics.vector import Point, dynamicsymbols
label_desc: Use image node_id 3 for calling the PathwayBase obj's underlying member method code with example usage: obj.attachments(attachments) without return types