class_docstr: An ordered sequence of named coordinates of a specified dtype.
  
  A coordinate system is defined by the names of the coordinates,
  (attribute ``coord_names``) and the numpy dtype of each coordinate
  value (attribute ``coord_dtype``).  The coordinate system can also
  have a name.
  
  >>> names = ['first', 'second', 'third']
  >>> cs = CoordinateSystem(names, 'a coordinate system', np.float64)
  >>> cs.coord_names
  ('first', 'second', 'third')
  >>> cs.name
  'a coordinate system'
  >>> cs.coord_dtype
  dtype('float64')
  
  The coordinate system also has a ``dtype`` which is the composite
  numpy dtype, made from the (``names``, ``coord_dtype``).
  
  >>> dtype_template = [(name, np.float64) for name in cs.coord_names]
  >>> dtype_should_be = np.dtype(dtype_template)
  >>> cs.dtype == dtype_should_be
  True
  
  Two CoordinateSystems are equal if they have the same dtype
  and the same names and the same name.
  
  >>> another_cs = CoordinateSystem(names, 'not irrelevant', np.float64)
  >>> cs == another_cs
  False
  >>> cs.dtype == another_cs.dtype
  True
  >>> cs.name == another_cs.name
  False
class_docstr_tok: ["An","ordered","sequence","of","named","coordinates","of","a","specified","dtype",".","A","coordinate","system","is","defined","by","the","names","of","the","coordinates",",","(","attribute","``","coord_names","``",")","and","the","numpy","dtype","of","each","coordinate","value","(","attribute","``","coord_dtype","``",")",".","The","coordinate","system","can","also","have","a","name",".",">",">",">","names","=","[","'first","'",",","'second","'",",","'third","'","]",">",">",">","cs","=","CoordinateSystem","(","names",",","'","a","coordinate","system","'",",","np.float64",")",">",">",">","cs.coord_names","(","'first","'",",","'second","'",",","'third","'",")",">",">",">","cs.name","'","a","coordinate","system'",">",">",">","cs.coord_dtype","dtype","(","'float64","'",")","The","coordinate","system","also","has","a","``","dtype","``","which","is","the","composite","numpy","dtype",",","made","from","the","(","``","names","``",",","``","coord_dtype","``",")",".",">",">",">","dtype_template","=","[","(","name",",","np.float64",")","for","name","in","cs.coord_names","]",">",">",">","dtype_should_be","=","np.dtype","(","dtype_template",")",">",">",">","cs.dtype","==","dtype_should_be","True","Two","CoordinateSystems","are","equal","if","they","have","the","same","dtype","and","the","same","names","and","the","same","name",".",">",">",">","another_cs","=","CoordinateSystem","(","names",",","'not","irrelevant","'",",","np.float64",")",">",">",">","cs","==","another_cs","False",">",">",">","cs.dtype","==","another_cs.dtype","True",">",">",">","cs.name","==","another_cs.name","False"]
code: def __setattr__(self, key, value):
      if key in self.__dict__:
          raise AttributeError(
              f"the value of {key} has already been set and all attributes are read-only"
          )
      object.__setattr__(self, key, value)
  
imports: import numpy
label_desc: Use image node_id 2 for calling the CoordinateSystem obj's underlying member method code with example usage: obj.__setattr__(key, value) without return types