code: def repr(self, changed_widgets=None):
          
          if changed_widgets is None:
              changed_widgets = {}
          local_changed_widgets = {}
          _innerHTML = self.innerHTML(local_changed_widgets)
  
          if self._ischanged() or ( len(local_changed_widgets) > 0 ):
              self._backup_repr = ''.join(('<', self.type, ' ', self._repr_attributes, '>', 
                                          _innerHTML, '</', self.type, '>'))
              #faster but unsupported before python3.6
              #self._backup_repr = f'<{self.type} {self._repr_attributes}>{_innerHTML}</{self.type}>'
          if self._ischanged():
              # if self changed, no matter about the children because will be updated the entire parent
              # and so local_changed_widgets is not merged
              changed_widgets[self] = self._backup_repr
              self._set_updated()
          else:
              changed_widgets.update(local_changed_widgets)
          return self._backup_repr
docs: It is used to automatically represent the object to HTML format
          packs all the attributes, children and so on.
  
          Args:
              changed_widgets (dict): A dictionary containing a collection of tags that have to be updated.
                  The tag that have to be updated is the key, and the value is its textual repr.