Slots

For performance reasons all tree nodes support slots. They all sub-class the HasSlots class, which is the top-level class of pypet (its direct descendant is HasLogger, see below). This class provides an __all_slots__ property (with the help of the MetaSlotMachine metaclass) that lists all existing __slots__ of a class including the inherited ones. Moreover, via __getstate__ and __setstate__ HasSlots takes care that all sub-classes can be pickled with the lowest protocol and don’t need to implement __getstate__ and __setstate__ themselves even when they have __slots__. However, sub-classes that still implement these functions should call the parent ones via super. Sub-classes are not required to define __slots__. If they don’t, HasSlots wil also automatically handle their __dict__ in __getstate__ and __setstate__.

Logging

HasLogger can be sub-classed to allow per class or even per instance logging. The logger is initialized via _set_logger() and is available via the _logger attribute. HasLogger also takes care that the logger does not get pickled when __getstate__ and __setstate__ are called. Thus, you are always advised in sub-classes that also implement these functions to call the parent ones via super. HasLogger is a direct sub-class of HasSlots. Hence, support for __slots__ is ensured.