<!DOCTYPE html PUBLIC
"-//W3C//DTD HTML 4.0 Transitional//EN">
<link rel=
"STYLESHEET" href=
"ref.css" type='text/css'
/>
<link rel=
"SHORTCUT ICON" href=
"../icons/pyfav.png" type=
"image/png" />
<link rel='start' href='../index.html' title='Python Documentation Index'
/>
<link rel=
"first" href=
"ref.html" title='Python Reference Manual'
/>
<link rel='contents' href='contents.html'
title=
"Contents" />
<link rel='index' href='genindex.html' title='Index'
/>
<link rel='last' href='about.html' title='About this document...'
/>
<link rel='help' href='about.html' title='About this document...'
/>
<link rel=
"next" href=
"callable-types.html" />
<link rel=
"prev" href=
"attribute-access.html" />
<link rel=
"parent" href=
"specialnames.html" />
<link rel=
"next" href=
"callable-types.html" />
<meta name='aesop' content='information'
/>
<title>3.3.3 Customizing class creation
</title>
<div id='top-navigation-panel' xml:id='top-navigation-panel'
>
<table align=
"center" width=
"100%" cellpadding=
"0" cellspacing=
"2">
<td class='online-navigation'
><a rel=
"prev" title=
"3.3.2.4 __slots__"
href=
"slots.html"><img src='../icons/previous.png'
border='
0' height='
32' alt='Previous Page' width='
32'
/></A></td>
<td class='online-navigation'
><a rel=
"parent" title=
"3.3 Special method names"
href=
"specialnames.html"><img src='../icons/up.png'
border='
0' height='
32' alt='Up One Level' width='
32'
/></A></td>
<td class='online-navigation'
><a rel=
"next" title=
"3.3.4 Emulating callable objects"
href=
"callable-types.html"><img src='../icons/next.png'
border='
0' height='
32' alt='Next Page' width='
32'
/></A></td>
<td align=
"center" width=
"100%">Python Reference Manual
</td>
<td class='online-navigation'
><a rel=
"contents" title=
"Table of Contents"
href=
"contents.html"><img src='../icons/contents.png'
border='
0' height='
32' alt='Contents' width='
32'
/></A></td>
<td class='online-navigation'
><img src='../icons/blank.png'
border='
0' height='
32' alt='' width='
32'
/></td>
<td class='online-navigation'
><a rel=
"index" title=
"Index"
href=
"genindex.html"><img src='../icons/index.png'
border='
0' height='
32' alt='Index' width='
32'
/></A></td>
<div class='online-navigation'
>
<b class=
"navlabel">Previous:
</b>
<a class=
"sectref" rel=
"prev" href=
"slots.html">3.3.2.4 __slots__
</A>
<b class=
"navlabel">Up:
</b>
<a class=
"sectref" rel=
"parent" href=
"specialnames.html">3.3 Special method names
</A>
<b class=
"navlabel">Next:
</b>
<a class=
"sectref" rel=
"next" href=
"callable-types.html">3.3.4 Emulating callable objects
</A>
<!--End of Navigation Panel-->
<H2><A NAME=
"SECTION005330000000000000000"></A><A NAME=
"metaclasses"></A>
3.3.3 Customizing class creation
By default, new-style classes are constructed using
<tt class=
"function">type()
</tt>.
A class definition is read into a separate namespace and the value
of class name is bound to the result of
<code>type(name, bases, dict)
</code>.
When the class definition is read, if
<var>__metaclass__
</var> is defined
then the callable assigned to it will be called instead of
<tt class=
"function">type()
</tt>.
The allows classes or functions to be written which monitor or alter the class
<LI>Modifying the class dictionary prior to the class being created.
<LI>Returning an instance of another class - essentially performing
the role of a factory function.
<dl><dt><b><tt id='l2h-
218' xml:id='l2h-
218'
>__metaclass__
</tt></b></dt>
This variable can be any callable accepting arguments for
<code>name
</code>,
<code>bases
</code>, and
<code>dict
</code>. Upon class creation, the callable is
used instead of the built-in
<tt class=
"function">type()
</tt>.
<span class=
"versionnote">New in version
2.2.
</span>
The appropriate metaclass is determined by the following precedence rules:
<LI>If
<code>dict['__metaclass__']
</code> exists, it is used.
<LI>Otherwise, if there is at least one base class, its metaclass is used
(this looks for a
<var>__class__
</var> attribute first and if not found, uses its
<LI>Otherwise, if a global variable named __metaclass__ exists, it is used.
<LI>Otherwise, the old-style, classic metaclass (types.ClassType) is used.
The potential uses for metaclasses are boundless. Some ideas that have
been explored including logging, interface checking, automatic delegation,
automatic property creation, proxies, frameworks, and automatic resource
<div class='online-navigation'
>
<table align=
"center" width=
"100%" cellpadding=
"0" cellspacing=
"2">
<td class='online-navigation'
><a rel=
"prev" title=
"3.3.2.4 __slots__"
href=
"slots.html"><img src='../icons/previous.png'
border='
0' height='
32' alt='Previous Page' width='
32'
/></A></td>
<td class='online-navigation'
><a rel=
"parent" title=
"3.3 Special method names"
href=
"specialnames.html"><img src='../icons/up.png'
border='
0' height='
32' alt='Up One Level' width='
32'
/></A></td>
<td class='online-navigation'
><a rel=
"next" title=
"3.3.4 Emulating callable objects"
href=
"callable-types.html"><img src='../icons/next.png'
border='
0' height='
32' alt='Next Page' width='
32'
/></A></td>
<td align=
"center" width=
"100%">Python Reference Manual
</td>
<td class='online-navigation'
><a rel=
"contents" title=
"Table of Contents"
href=
"contents.html"><img src='../icons/contents.png'
border='
0' height='
32' alt='Contents' width='
32'
/></A></td>
<td class='online-navigation'
><img src='../icons/blank.png'
border='
0' height='
32' alt='' width='
32'
/></td>
<td class='online-navigation'
><a rel=
"index" title=
"Index"
href=
"genindex.html"><img src='../icons/index.png'
border='
0' height='
32' alt='Index' width='
32'
/></A></td>
<div class='online-navigation'
>
<b class=
"navlabel">Previous:
</b>
<a class=
"sectref" rel=
"prev" href=
"slots.html">3.3.2.4 __slots__
</A>
<b class=
"navlabel">Up:
</b>
<a class=
"sectref" rel=
"parent" href=
"specialnames.html">3.3 Special method names
</A>
<b class=
"navlabel">Next:
</b>
<a class=
"sectref" rel=
"next" href=
"callable-types.html">3.3.4 Emulating callable objects
</A>
<span class=
"release-info">Release
2.4.2, documentation updated on
28 September
2005.
</span>
<!--End of Navigation Panel-->
See
<i><a href=
"about.html">About this document...
</a></i> for information on suggesting changes.