# VTK::WrappingPythonCore

## Python Wrapper Core Classes

This directory provides the core support classes that are used by VTK's
Python wrappers.  The classes can be split into two broad categories:
the *PyVTK* classes provide C APIs for Python types, while the *vtkPython*
classes are C++ utility classes.

### The Python Classes

#### PyVTKObject

This defines APIs for creating and managing *PyVTKClass* objects, which
are Python extension types that wrap vtkObjectBase-derived classes, and
*PyVTKObject* objects, which are instances of the these extension types.

#### PyVTKSpecialObject

Similarly, *PyVTKSpecialType* objects are Python extension types that
wrap C++ classes that are *not* derived from vtkObjectBase, and
*PyVTKSpecialObject* wraps the instances.  These object are reference
counted on the Python side, but not on the C++ side.  In general they
are lightweight objects that are cheap to copy.

#### PyVTKTemplate

These objects represent C++ class templates.  The wrappers instantiate the
templates over a limited set of template parameters, and *PyVTKTemplate*
is a container for the template instantiations.  It is implemented as a
dictionary that maps template parameters to template instantiations.

#### PyVTKEnum

This provides an API for managing subtypes of the Python *int* type that
represent named C++ enum types.

#### PyVTKNamespace

This provides an API for managing subtypes of the Python *module* type that
represent C++ namespaces.

#### PyVTKReference

Python does not support C++-style pass-by-reference, but pass-by-reference
can be simulated by passing a typed container whose contents can be modified.
The *PyVTKReference* type defines such containers.  Within Python, this
type can be accessed as *vtkmodules.vtkCommonCore.reference*.

#### PyVTKMethodDescriptor

In Python, a method descriptor is an object that customizes method lookup,
specifically it customizes *object.method* and *class.method* method access.
The *PyVTKMethodDescriptor* customizes the access of *PyVTKClass* methods.
It handles bound method calls, unbound method calls, static method calls,
and calls to overloaded methods.

#### PyVTKExtras

This one is not actually a class, it is a helper function that adds utility
methods and types like the previously-mentioned *reference* type to the
vtkCommonCore module.  Everything in this file becomes part of vtkCommonCore.


### The C++ Classes

#### vtkPythonUtil

This is a singleton that keeps track of all the vtk-python extension modules
that have been loaded, and all of the vtk-python objects that have been
instantiated.  It contains all of the machinery that is needed for moving
VTK objects from C++ to Python and back again.

#### vtkPythonCommand

This is a subclass of vtkCommand that allows Python methods to be used as
VTK observer callbacks.

#### vtkPythonArgs

When a method call is performed in the wrappers, vtkPythonArgs does the
conversion of the arguments from Python to C++, and it also converts the
return value from C++ to Python.

#### vtkPythonOverload

When an overloaded method is called from Python, this class uses the method
arguments to decide which overload to use.

#### vtkPythonCompatibility

This is actually just a header, not a class.  It contains macros that make
it easier to write code that is compatible with different versions of the
Python C API.

#### vtkSmartPyObject

Whereas the other classes in this directory are for using VTK C++ objects
through Python, this class is for using Python objects through C++.  This
class is a C++ smart pointer that handles Python reference counting.
