class_docstr: A Link defines some connection between a source and target object
  in their visualization. It is quite similar to a Stream as it
  allows defining callbacks in response to some change or event on
  the source object, however, unlike a Stream, it does not transfer
  data and make it available to user defined subscribers. Instead
  a Link directly causes some action to occur on the target, for JS
  based backends this usually means that a corresponding JS callback
  will effect some change on the target in response to a change on
  the source.
  
  A Link must define a source object which is what triggers events,
  but must not define a target. It is also possible to define bi-
  directional links between the source and target object.
code: def __init__(self, source, target=None, **params):
      if source is None:
          raise ValueError(
              f"{type(self).__name__} must define a source"
          )
      if self._requires_target and target is None:
          raise ValueError(
              f"{type(self).__name__} must define a target."
          )
  
      # Source is stored as a weakref to allow it to be garbage collected
      self._source = None if source is None else weakref.ref(source)
      self._target = None if target is None else weakref.ref(target)
      super().__init__(**params)
      self.link()
  
imports: import weakref
  from collections import defaultdict
  import param
  from ..core.util import dimension_sanitizer
label_desc: Use image node_id 1 to create a new Link object from inherited base classes: param with example: obj = Link(source, target)