class_docstr: This class wraps a cache and a generator which iterates over all primitive
  classes. When deserializing a primitive if it is not in the cache then we
  iterate until it is found, adding every seen class to the cache. When
  deserializing the next primitive the iteration resumes where it left off. This
  means that we never visit a class more than once.
class_docstr_tok: ["This","class","wraps","a","cache","and","a","generator","which","iterates","over","all","primitive","classes",".","When","deserializing","a","primitive","if","it","is","not","in","the","cache","then","we","iterate","until","it","is","found",",","adding","every","seen","class","to","the","cache",".","When","deserializing","the","next","primitive","the","iteration","resumes","where","it","left","off",".","This","means","that","we","never","visit","a","class","more","than","once","."]
code: def __init__(self):
      # Cache to avoid repeatedly searching for primitive class
      # (class_name, module_name) -> class
      self.class_cache = {}
  
      self.primitive_classes = find_descendents(PrimitiveBase)
  
imports: import importlib.util
  import os
  from inspect import getfullargspec, getsource, isclass
  from typing import Dict, List
  import pandas
  from woodwork import list_logical_types, list_semantic_tags, type_system
  from woodwork.column_schema import ColumnSchema
  from woodwork.logical_types import NaturalLanguage
  import featuretools
  from featuretools.primitives import NumberOfCommonWords
  from featuretools.primitives.base import AggregationPrimitive, PrimitiveBase, TransformPrimitive
  from featuretools.utils.gen_utils import Library, find_descendents
label_desc: Use image node_id 1 to create a new PrimitivesDeserializer object from inherited base classes: object with example: obj = PrimitivesDeserializer()