class_docstr: PerspectiveViewer wraps the `perspective.Table` API and exposes an API
  around creating views, loading data, and updating data.
class_docstr_tok: ["PerspectiveViewer","wraps","the","`","perspective.Table","`","API","and","exposes","an","API","around","creating","views",",","loading","data",",","and","updating","data","."]
docstr: Get the viewer's attribute as a dictionary, symmetric with `restore`
  so that a viewer's configuration can be reproduced.
docstr_tok: ["Get","the","viewer","'s","attribute","as","a","dictionary",",","symmetric","with","`","restore","`","so","that","a","viewer","'s","configuration","can","be","reproduced","."]
code: def save(self):
      """Get the viewer's attribute as a dictionary, symmetric with `restore`
      so that a viewer's configuration can be reproduced."""
      return {
          attr: getattr(self, attr)
          for attr in PerspectiveViewer.PERSISTENT_ATTRIBUTES
      }
  
file_path: perspective/python/perspective/perspective/viewer/viewer.py
imports: from random import random
  from ..libpsp import is_libpsp
  from .validate import validate_aggregates, validate_split_by, validate_columns, validate_expressions, validate_filter, validate_plugin, validate_plugin_config, validate_group_by, validate_sort
  from .viewer_traitlets import PerspectiveTraitlets
label_desc: Use image node_id 7 for calling the PerspectiveViewer obj's underlying member method code with example usage: obj.save() and returns: unknown