class_docstr: Dictionary subclass enabling attribute lookup/assignment of keys/values.
  
  For example::
      >>> m = AttributeDict({'foo': 'bar'})
      >>> m.foo
      'bar'
      >>> m.foo = 'not bar'
      >>> m['foo']
      'not bar'
  ``AttributeDict`` objects also provide ``.first()`` which acts like
  ``.get()`` but accepts multiple keys as arguments, and returns the value of
  the first hit, e.g.::
      >>> m = AttributeDict({'foo': 'bar', 'biz': 'baz'})
      >>> m.first('wrong', 'incorrect', 'foo', 'biz')
      'bar'
docstr: Designate named attributes as read-only with the corresponding msg
  
  Method is additive. Making additional calls to this method will update
  existing messages and add to the current set of _read_only names.
docstr_tok: ["Designate","named","attributes","as","read-only","with","the","corresponding","msg","Method","is","additive",".","Making","additional","calls","to","this","method","will","update","existing","messages","and","add","to","the","current","set","of","_read_only","names","."]
code: def set_read_only(self, names, msg="Attribute is read-only"):
      """
      Designate named attributes as read-only with the corresponding msg
  
      Method is additive. Making additional calls to this method will update
      existing messages and add to the current set of _read_only names.
      """
      new_read_only = {name: msg for name in names}
      if getattr(self, "_read_only", False):
          self._read_only.update(new_read_only)
      else:
          object.__setattr__(self, "_read_only", new_read_only)
  
imports: import shlex
  import sys
  import uuid
  import hashlib
  import collections
  import subprocess
  import logging
  import io
  import json
  import secrets
  import string
  import inspect
  from html import escape
  from functools import wraps
  from typing import Union
  from dash.types import RendererHooks
label_desc: Use image node_id 3 for calling the AttributeDict obj's underlying member method code with example usage: obj.set_read_only(names, msg) without return types