class_docstr: Internal convenient class to wrap many Python objects into one
  (this class is not safe as the hash method does not check if values are effectively hashable).
  
  **Example:**
  
  .. code-block:: python
  
      from pytensor.link.c.params_type import ParamsType, Params
      from pytensor.scalar import ScalarType
      # You must create a ParamsType first:
      params_type = ParamsType(attr1=ScalarType('int32'),
                               key2=ScalarType('float32'),
                               field3=ScalarType('int64'))
      # Then you can create a Params object with
      # the params type defined above and values for attributes.
      params = Params(params_type, attr1=1, key2=2.0, field3=3)
      print(params.attr1, params.key2, params.field3)
      d = dict(attr1=1, key2=2.5, field3=-1)
      params2 = Params(params_type, **d)
      print(params2.attr1, params2.key2, params2.field3)
class_docstr_tok: ["Internal","convenient","class","to","wrap","many","Python","objects","into","one","(","this","class","is","not","safe","as","the","hash","method","does","not","check","if","values","are","effectively","hashable",")",".","*","*","Example",":","*","*","..","code-block",":",":","python","from","pytensor.link.c.params_type","import","ParamsType",",","Params","from","pytensor.scalar","import","ScalarType","#","You","must","create","a","ParamsType","first",":","params_type","=","ParamsType","(","attr1=ScalarType","(","'int32","'",")",",","key2=ScalarType","(","'float32","'",")",",","field3=ScalarType","(","'int64","'",")",")","#","Then","you","can","create","a","Params","object","with","#","the","params","type","defined","above","and","values","for","attributes",".","params","=","Params","(","params_type",",","attr1=1",",","key2=2.0",",","field3=3",")","print","(","params.attr1",",","params.key2",",","params.field3",")","d","=","dict","(","attr1=1",",","key2=2.5",",","field3=-1",")","params2","=","Params","(","params_type",",","*","*","d",")","print","(","params2.attr1",",","params2.key2",",","params2.field3",")"]
code: def __setattr__(self, key, value):
      raise NotImplementedError("Params is immutable")
  
imports: import hashlib
  import re
  from pytensor.graph.utils import MethodNotDefined
  from pytensor.link.c.type import CType, EnumType
label_desc: Use image node_id 4 for calling the Params obj's underlying member method code with example usage: obj.__setattr__(key, value) without return types