class_docstr: Base class for visitor that finds class definitions based on class inheritance. Derived classes are expected to
  define class_name and implement the analyze_class_def method.
  
  Attributes
  ----------
  class_name: str
      Name of class to identify, to be defined in subclasses.
class_docstr_tok: ["Base","class","for","visitor","that","finds","class","definitions","based","on","class","inheritance",".","Derived","classes","are","expected","to","define","class_name","and","implement","the","analyze_class_def","method",".","Attributes","--","--","--","--","--","class_name",":","str","Name","of","class","to","identify",",","to","be","defined","in","subclasses","."]
code: def visit_ClassDef(self, node: ast.ClassDef) -> None:
      bases = []
      for base in node.bases:
          if type(base) == ast.Attribute:
              bases.append(base.attr)
          elif type(base) == ast.Name:
              bases.append(base.id)
      if self.class_name in bases:
          entry = {"name": node.name, "type": self.class_name}
          entry.update(self.analyze_class_def(node))
          self.found.append(entry)
  
imports: import ast
  import inspect
  from pathlib import Path
  from typing import TYPE_CHECKING, Any, Dict, List, Optional, Set, Type, Union
label_desc: Use image node_id 3 for calling the LightningVisitor obj's underlying member method code with example usage: obj.visit_ClassDef(node) without return types