<HTML>

<HEAD>
<TITLE>Metaclasses in Python 1.5</TITLE>
</HEAD>

<BODY BGCOLOR="FFFFFF">

<H1>Metaclasses in Python 1.5</H1>
<H2>(A.k.a. The Killer Joke :-)</H2>

<HR>

(<i>Postscript:</i> reading this essay is probably not the best way to
understand the metaclass hook described here.  See a <A
HREF="meta-vladimir.txt">message posted by Vladimir Marangozov</A>
which may give a gentler introduction to the matter.  You may also
want to search Deja News for messages with "metaclass" in the subject
posted to comp.lang.python in July and August 1998.)

<HR>

<P>In previous Python releases (and still in 1.5), there is something
called the ``Don Beaudry hook'', after its inventor and champion.
This allows C extensions to provide alternate class behavior, thereby
allowing the Python class syntax to be used to define other class-like
entities.  Don Beaudry has used this in his infamous <A
HREF="http://maigret.cog.brown.edu/pyutil/">MESS</A> package; Jim
Fulton has used it in his <A
HREF="http://www.digicool.com/releases/ExtensionClass/">Extension
Classes</A> package.  (It has also been referred to as the ``Don
Beaudry <i>hack</i>,'' but that's a misnomer.  There's nothing hackish
about it -- in fact, it is rather elegant and deep, even though
there's something dark to it.)

<P>(On first reading, you may want to skip directly to the examples in
the section "Writing Metaclasses in Python" below, unless you want
your head to explode.)

<P>

<HR>

<P>Documentation of the Don Beaudry hook has purposefully been kept
minimal, since it is a feature of incredible power, and is easily
abused.  Basically, it checks whether the <b>type of the base
class</b> is callable, and if so, it is called to create the new
class.

<P>Note the two indirection levels.  Take a simple example:

<PRE>
class B:
    pass

class C(B):
    pass
</PRE>

Take a look at the second class definition, and try to fathom ``the
type of the base class is callable.''

<P>(Types are not classes, by the way.  See questions 4.2, 4.19 and in
particular 6.22 in the <A
HREF="http://www.python.org/cgi-bin/faqw.py" >Python FAQ</A>
for more on this topic.)

<P>

<UL>

<LI>The <b>base class</b> is B; this one's easy.<P>

<LI>Since B is a class, its type is ``class''; so the <b>type of the
base class</b> is the type ``class''.  This is also known as
types.ClassType, assuming the standard module <code>types</code> has
been imported.<P>

<LI>Now is the type ``class'' <b>callable</b>?  No, because types (in
core Python) are never callable.  Classes are callable (calling a
class creates a new instance) but types aren't.<P>

</UL>

<P>So our conclusion is that in our example, the type of the base
class (of C) is not callable.  So the Don Beaudry hook does not apply,
and the default class creation mechanism is used (which is also used
when there is no base class).  In fact, the Don Beaudry hook never
applies when using only core Python, since the type of a core object
is never callable.

<P>So what do Don and Jim do in order to use Don's hook?  Write an
extension that defines at least two new Python object types.  The
first would be the type for ``class-like'' objects usable as a base
class, to trigger Don's hook.  This type must be made callable.
That's why we need a second type.  Whether an object is callable
depends on its type.  So whether a type object is callable depends on
<i>its</i> type, which is a <i>meta-type</i>.  (In core Python there
is only one meta-type, the type ``type'' (types.TypeType), which is
the type of all type objects, even itself.)  A new meta-type must
be defined that makes the type of the class-like objects callable.
(Normally, a third type would also be needed, the new ``instance''
type, but this is not an absolute requirement -- the new class type
could return an object of some existing type when invoked to create an
instance.)

<P>Still confused?  Here's a simple device due to Don himself to
explain metaclasses.  Take a simple class definition; assume B is a
special class that triggers Don's hook:

<PRE>
class C(B):
    a = 1
    b = 2
</PRE>

This can be though of as equivalent to:

<PRE>
C = type(B)('C', (B,), {'a': 1, 'b': 2})
</PRE>

If that's too dense for you, here's the same thing written out using
temporary variables:

<PRE>
creator = type(B)               # The type of the base class
name = 'C'                      # The name of the new class
bases = (B,)                    # A tuple containing the base class(es)
namespace = {'a': 1, 'b': 2}    # The namespace of the class statement
C = creator(name, bases, namespace)
</PRE>

This is analogous to what happens without the Don Beaudry hook, except
that in that case the creator function is set to the default class
creator.

<P>In either case, the creator is called with three arguments.  The
first one, <i>name</i>, is the name of the new class (as given at the
top of the class statement).  The <i>bases</i> argument is a tuple of
base classes (a singleton tuple if there's only one base class, like
the example).  Finally, <i>namespace</i> is a dictionary containing
the local variables collected during execution of the class statement.

<P>Note that the contents of the namespace dictionary is simply
whatever names were defined in the class statement.  A little-known
fact is that when Python executes a class statement, it enters a new
local namespace, and all assignments and function definitions take
place in this namespace.  Thus, after executing the following class
statement:

<PRE>
class C:
    a = 1
    def f(s): pass
</PRE>

the class namespace's contents would be {'a': 1, 'f': &lt;function f
...&gt;}.

<P>But enough already about writing Python metaclasses in C; read the
documentation of <A
HREF="http://maigret.cog.brown.edu/pyutil/">MESS</A> or <A
HREF="http://www.digicool.com/papers/ExtensionClass.html" >Extension
Classes</A> for more information.

<P>

<HR>

<H2>Writing Metaclasses in Python</H2>

<P>In Python 1.5, the requirement to write a C extension in order to
write metaclasses has been dropped (though you can still do
it, of course).  In addition to the check ``is the type of the base
class callable,'' there's a check ``does the base class have a
__class__ attribute.''  If so, it is assumed that the __class__
attribute refers to a class.

<P>Let's repeat our simple example from above:

<PRE>
class C(B):
    a = 1
    b = 2
</PRE>

Assuming B has a __class__ attribute, this translates into:

<PRE>
C = B.__class__('C', (B,), {'a': 1, 'b': 2})
</PRE>

This is exactly the same as before except that instead of type(B),
B.__class__ is invoked.  If you have read <A HREF=
"http://www.python.org/cgi-bin/faqw.py?req=show&file=faq06.022.htp"
>FAQ question 6.22</A> you will understand that while there is a big
technical difference between type(B) and B.__class__, they play the
same role at different abstraction levels.  And perhaps at some point
in the future they will really be the same thing (at which point you
would be able to derive subclasses from built-in types).

<P>At this point it may be worth mentioning that C.__class__ is the
same object as B.__class__, i.e., C's metaclass is the same as B's
metaclass.  In other words, subclassing an existing class creates a
new (meta)inststance of the base class's metaclass.

<P>Going back to the example, the class B.__class__ is instantiated,
passing its constructor the same three arguments that are passed to
the default class constructor or to an extension's metaclass:
<i>name</i>, <i>bases</i>, and <i>namespace</i>.

<P>It is easy to be confused by what exactly happens when using a
metaclass, because we lose the absolute distinction between classes
and instances: a class is an instance of a metaclass (a
``metainstance''), but technically (i.e. in the eyes of the python
runtime system), the metaclass is just a class, and the metainstance
is just an instance.  At the end of the class statement, the metaclass
whose metainstance is used as a base class is instantiated, yielding a
second metainstance (of the same metaclass).  This metainstance is
then used as a (normal, non-meta) class; instantiation of the class
means calling the metainstance, and this will return a real instance.
And what class is that an instance of?  Conceptually, it is of course
an instance of our metainstance; but in most cases the Python runtime
system will see it as an instance of a a helper class used by the
metaclass to implement its (non-meta) instances...

<P>Hopefully an example will make things clearer.  Let's presume we
have a metaclass MetaClass1.  It's helper class (for non-meta
instances) is callled HelperClass1.  We now (manually) instantiate
MetaClass1 once to get an empty special base class:

<PRE>
BaseClass1 = MetaClass1("BaseClass1", (), {})
</PRE>

We can now use BaseClass1 as a base class in a class statement:

<PRE>
class MySpecialClass(BaseClass1):
    i = 1
    def f(s): pass
</PRE>

At this point, MySpecialClass is defined; it is a metainstance of
MetaClass1 just like BaseClass1, and in fact the expression
``BaseClass1.__class__ == MySpecialClass.__class__ == MetaClass1''
yields true.

<P>We are now ready to create instances of MySpecialClass.  Let's
assume that no constructor arguments are required:

<PRE>
x = MySpecialClass()
y = MySpecialClass()
print x.__class__, y.__class__
</PRE>

The print statement shows that x and y are instances of HelperClass1.
How did this happen?  MySpecialClass is an instance of MetaClass1
(``meta'' is irrelevant here); when an instance is called, its
__call__ method is invoked, and presumably the __call__ method defined
by MetaClass1 returns an instance of HelperClass1.

<P>Now let's see how we could use metaclasses -- what can we do
with metaclasses that we can't easily do without them?  Here's one
idea: a metaclass could automatically insert trace calls for all
method calls.  Let's first develop a simplified example, without
support for inheritance or other ``advanced'' Python features (we'll
add those later).

<PRE>
import types

class Tracing:
    def __init__(self, name, bases, namespace):
        """Create a new class."""
        self.__name__ = name
        self.__bases__ = bases
        self.__namespace__ = namespace
    def __call__(self):
        """Create a new instance."""
        return Instance(self)

class Instance:
    def __init__(self, klass):
        self.__klass__ = klass
    def __getattr__(self, name):
        try:
            value = self.__klass__.__namespace__[name]
        except KeyError:
            raise AttributeError, name
        if type(value) is not types.FunctionType:
            return value
        return BoundMethod(value, self)

class BoundMethod:
    def __init__(self, function, instance):
        self.function = function
        self.instance = instance
    def __call__(self, *args):
        print "calling", self.function, "for", self.instance, "with", args
        return apply(self.function, (self.instance,) + args)

Trace = Tracing('Trace', (), {})

class MyTracedClass(Trace):
    def method1(self, a):
        self.a = a
    def method2(self):
        return self.a

aninstance = MyTracedClass()

aninstance.method1(10)

print "the answer is %d" % aninstance.method2()
</PRE>

Confused already?  The intention is to read this from top down.  The
Tracing class is the metaclass we're defining.  Its structure is
really simple.

<P>

<UL>

<LI>The __init__ method is invoked when a new Tracing instance is
created, e.g. the definition of class MyTracedClass later in the
example.  It simply saves the class name, base classes and namespace
as instance variables.<P>

<LI>The __call__ method is invoked when a Tracing instance is called,
e.g. the creation of aninstance later in the example.  It returns an
instance of the class Instance, which is defined next.<P>

</UL>

<P>The class Instance is the class used for all instances of classes
built using the Tracing metaclass, e.g. aninstance.  It has two
methods:

<P>

<UL>

<LI>The __init__ method is invoked from the Tracing.__call__ method
above to initialize a new instance.  It saves the class reference as
an instance variable.  It uses a funny name because the user's
instance variables (e.g. self.a later in the example) live in the same
namespace.<P>

<LI>The __getattr__ method is invoked whenever the user code
references an attribute of the instance that is not an instance
variable (nor a class variable; but except for __init__ and
__getattr__ there are no class variables).  It will be called, for
example, when aninstance.method1 is referenced in the example, with
self set to aninstance and name set to the string "method1".<P>

</UL>

<P>The __getattr__ method looks the name up in the __namespace__
dictionary.  If it isn't found, it raises an AttributeError exception.
(In a more realistic example, it would first have to look through the
base classes as well.)  If it is found, there are two possibilities:
it's either a function or it isn't.  If it's not a function, it is
assumed to be a class variable, and its value is returned.  If it's a
function, we have to ``wrap'' it in instance of yet another helper
class, BoundMethod.

<P>The BoundMethod class is needed to implement a familiar feature:
when a method is defined, it has an initial argument, self, which is
automatically bound to the relevant instance when it is called.  For
example, aninstance.method1(10) is equivalent to method1(aninstance,
10).  In the example if this call, first a temporary BoundMethod
instance is created with the following constructor call: temp =
BoundMethod(method1, aninstance); then this instance is called as
temp(10).  After the call, the temporary instance is discarded.

<P>

<UL>

<LI>The __init__ method is invoked for the constructor call
BoundMethod(method1, aninstance).  It simply saves away its
arguments.<P>

<LI>The __call__ method is invoked when the bound method instance is
called, as in temp(10).  It needs to call method1(aninstance, 10).
However, even though self.function is now method1 and self.instance is
aninstance, it can't call self.function(self.instance, args) directly,
because it should work regardless of the number of arguments passed.
(For simplicity, support for keyword arguments has been omitted.)<P>

</UL>

<P>In order to be able to support arbitrary argument lists, the
__call__ method first constructs a new argument tuple.  Conveniently,
because of the notation *args in __call__'s own argument list, the
arguments to __call__ (except for self) are placed in the tuple args.
To construct the desired argument list, we concatenate a singleton
tuple containing the instance with the args tuple: (self.instance,) +
args.  (Note the trailing comma used to construct the singleton
tuple.)  In our example, the resulting argument tuple is (aninstance,
10).

<P>The intrinsic function apply() takes a function and an argument
tuple and calls the function for it.  In our example, we are calling
apply(method1, (aninstance, 10)) which is equivalent to calling
method(aninstance, 10).

<P>From here on, things should come together quite easily.  The output
of the example code is something like this:

<PRE>
calling &lt;function method1 at ae8d8&gt; for &lt;Instance instance at 95ab0&gt; with (10,)
calling &lt;function method2 at ae900&gt; for &lt;Instance instance at 95ab0&gt; with ()
the answer is 10
</PRE>

<P>That was about the shortest meaningful example that I could come up
with.  A real tracing metaclass (for example, <A
HREF="#Trace">Trace.py</A> discussed below) needs to be more
complicated in two dimensions.

<P>First, it needs to support more advanced Python features such as
class variables, inheritance, __init__ methods, and keyword arguments.

<P>Second, it needs to provide a more flexible way to handle the
actual tracing information; perhaps it should be possible to write
your own tracing function that gets called, perhaps it should be
possible to enable and disable tracing on a per-class or per-instance
basis, and perhaps a filter so that only interesting calls are traced;
it should also be able to trace the return value of the call (or the
exception it raised if an error occurs).  Even the Trace.py example
doesn't support all these features yet.

<P>

<HR>

<H1>Real-life Examples</H1>

<P>Have a look at some very preliminary examples that I coded up to
teach myself how to write metaclasses:

<DL>

<DT><A HREF="Enum.py">Enum.py</A>

<DD>This (ab)uses the class syntax as an elegant way to define
enumerated types.  The resulting classes are never instantiated --
rather, their class attributes are the enumerated values.  For
example:

<PRE>
class Color(Enum):
    red = 1
    green = 2
    blue = 3
print Color.red
</PRE>

will print the string ``Color.red'', while ``Color.red==1'' is true,
and ``Color.red + 1'' raise a TypeError exception.

<P>

<DT><A NAME=Trace></A><A HREF="Trace.py">Trace.py</A>

<DD>The resulting classes work much like standard
classes, but by setting a special class or instance attribute
__trace_output__ to point to a file, all calls to the class's methods
are traced.  It was a bit of a struggle to get this right.  This
should probably redone using the generic metaclass below.

<P>

<DT><A HREF="Meta.py">Meta.py</A>

<DD>A generic metaclass.  This is an attempt at finding out how much
standard class behavior can be mimicked by a metaclass.  The
preliminary answer appears to be that everything's fine as long as the
class (or its clients) don't look at the instance's __class__
attribute, nor at the class's __dict__ attribute.  The use of
__getattr__ internally makes the classic implementation of __getattr__
hooks tough; we provide a similar hook _getattr_ instead.
(__setattr__ and __delattr__ are not affected.)
(XXX Hm.  Could detect presence of __getattr__ and rename it.)

<P>

<DT><A HREF="Eiffel.py">Eiffel.py</A>

<DD>Uses the above generic metaclass to implement Eiffel style
pre-conditions and post-conditions.

<P>

<DT><A HREF="Synch.py">Synch.py</A>

<DD>Uses the above generic metaclass to implement synchronized
methods.

<P>

<DT><A HREF="Simple.py">Simple.py</A>

<DD>The example module used above.

<P>

</DL>

<P>A pattern seems to be emerging: almost all these uses of
metaclasses (except for Enum, which is probably more cute than useful)
mostly work by placing wrappers around method calls.  An obvious
problem with that is that it's not easy to combine the features of
different metaclasses, while this would actually be quite useful: for
example, I wouldn't mind getting a trace from the test run of the
Synch module, and it would be interesting to add preconditions to it
as well.  This needs more research.  Perhaps a metaclass could be
provided that allows stackable wrappers...

<P>

<HR>

<H2>Things You Could Do With Metaclasses</H2>

<P>There are lots of things you could do with metaclasses.  Most of
these can also be done with creative use of __getattr__, but
metaclasses make it easier to modify the attribute lookup behavior of
classes.  Here's a partial list.

<P>

<UL>

<LI>Enforce different inheritance semantics, e.g. automatically call
base class methods when a derived class overrides<P>

<LI>Implement class methods (e.g. if the first argument is not named
'self')<P>

<LI>Implement that each instance is initialized with <b>copies</b> of
all class variables<P>

<LI>Implement a different way to store instance variables (e.g. in a
list kept outside the the instance but indexed by the instance's id())<P>

<LI>Automatically wrap or trap all or certain methods

<UL>

<LI>for tracing

<LI>for precondition and postcondition checking

<LI>for synchronized methods

<LI>for automatic value caching

</UL>
<P>

<LI>When an attribute is a parameterless function, call it on
reference (to mimic it being an instance variable); same on assignment<P>

<LI>Instrumentation: see how many times various attributes are used<P>

<LI>Different semantics for __setattr__ and __getattr__ (e.g.  disable
them when they are being used recursively)<P>

<LI>Abuse class syntax for other things<P>

<LI>Experiment with automatic type checking<P>

<LI>Delegation (or acquisition)<P>

<LI>Dynamic inheritance patterns<P>

<LI>Automatic caching of methods<P>

</UL>

<P>

<HR>

<H4>Credits</H4>

<P>Many thanks to David Ascher and Donald Beaudry for their comments
on earlier draft of this paper.  Also thanks to Matt Conway and Tommy
Burnette for putting a seed for the idea of metaclasses in my
mind, nearly three years ago, even though at the time my response was
``you can do that with __getattr__ hooks...'' :-)

<P>

<HR>

</BODY>

</HTML>
