############################ The Magic of Metaprogramming ############################ :Date: 2013-03-15 :Speaker: Jeff Rush What it is? =========== + Code that writes, analyzes, or adjusts other code + Makes uses of metaclasses, decorators, descriptors + Python 2.x, new-style classes Model ===== + Code -> Data -> Events + Metaprogramming injects Metacode - adding attributes - adjusting values - registering instances - tagging objects - latching onto events Example ======= + Subclass Request object without modifying the original code + Catch the import! + Redfine class to be subclass + Hook to after import + Inspect which module is being imported + Re-arrange module + Return the module + ``from tau.metaservices import MetaServices`` You can subclass a module!! =========================== + stdlib: ``ihooks`` module - ``ihooks.ModuleImporter`` - ``ihooks.FancyModuleLoader`` + ``import types; types.ModuleType`` + ``class MyModule(types.ModuleType): ...`` How we got here =============== + Variables, functions, code, blah... + Rise of C structs, grouping variables into namespaces + Promotion of functions to "variables" + Namespace "assembly function" aka constructors + Prototype pattern: stamp out copies (or instances of objects) + Shared vs. non-shared namespaces (module vs. instance) + Rise of iterative lookup (aka scoping) + Stuff that things have in common (aka classes) + Classes of classes (aka inheritance) + Parent classses (aka multiple inheritance) + Who is creating the classes (aka metaclasses) + Subclass your metaclasses! Metaclasses =========== + Metaclass is a "kind of class" + New kinds useful for: - wrapping complexity - domain specific stuff - generate classes dynamically (e.g. XML DTDs) + Example: Create class object from database table