# uproot.models

This module defines models, which are classes of objects read from ROOT files.

Models must be subclasses of uproot.Model, and models for a specific version of a ROOT class must be subclasses of uproot.model.VersionedModel.

If a C++ class has no associated model, a new model class will be generated from the ROOT file’s `TStreamerInfo`.

To add a versionless model for a ROOT class:

1. Translate the ROOT class name from C++ to Python with uproot.classname_encode. For example, `"ROOT::RThing"` becomes `"Model_ROOT_3a3a_RThing"`.

2. Define a class with that name.

3. Explicitly add it to `uproot.classes`.

A versionless model is instantiated for any ROOT object with a given class name, regardless of its version. The deserialization procedure may need to include version-dependent code.

To add a versioned model for a ROOT class:

1. Translate the ROOT class name from C++ to Python with uproot.classname_encode with a specific `version`. For example version `2` of `"ROOT::RThing"` becomes `"Model_ROOT_3a3a_RThing_v2"`.

2. Define a class with that name.

3. Explicitly add it to a uproot.model.DispatchByVersion for that class. You might also need to add a uproot.model.DispatchByVersion to the `uproot.classes`.

A versioned model is only instantiated for a ROOT object with a given class name and version. Uproot has common versions of uproot.models.TBranch and uproot.models.TTree predefined so that it can usually avoid reading a ROOT file’s `TStreamerInfo`.

High-level methods and properties should not be defined on the model class; add them as behavior classes.

See also uproot.behaviors.