summaryrefslogtreecommitdiffstats
path: root/Doc
diff options
context:
space:
mode:
authorGeorg Brandl <georg@python.org>2008-01-07 19:17:10 (GMT)
committerGeorg Brandl <georg@python.org>2008-01-07 19:17:10 (GMT)
commit3ccb49afed5c6464f842aa0361d7b989094d9e47 (patch)
tree7c333e6a8d53da6c877f523f6840c1e120f3091e /Doc
parent61d2886491944a50fa888ff23f4c1058136320a1 (diff)
downloadcpython-3ccb49afed5c6464f842aa0361d7b989094d9e47.zip
cpython-3ccb49afed5c6464f842aa0361d7b989094d9e47.tar.gz
cpython-3ccb49afed5c6464f842aa0361d7b989094d9e47.tar.bz2
Clarify metaclass docs and add example.
Diffstat (limited to 'Doc')
-rw-r--r--Doc/reference/datamodel.rst19
1 files changed, 17 insertions, 2 deletions
diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst
index ed05b32..f8990f2 100644
--- a/Doc/reference/datamodel.rst
+++ b/Doc/reference/datamodel.rst
@@ -1177,7 +1177,8 @@ Basic customization
:meth:`__init__` method will not be invoked.
:meth:`__new__` is intended mainly to allow subclasses of immutable types (like
- int, str, or tuple) to customize instance creation.
+ int, str, or tuple) to customize instance creation. It is also commonly
+ overridden in custom metaclasses in order to customize class creation.
.. method:: object.__init__(self[, ...])
@@ -1651,7 +1652,7 @@ definition is read into a separate namespace and the value of class name is
bound to the result of ``type(name, bases, dict)``.
When the class definition is read, if *__metaclass__* is defined then the
-callable assigned to it will be called instead of :func:`type`. The allows
+callable assigned to it will be called instead of :func:`type`. This allows
classes or functions to be written which monitor or alter the class creation
process:
@@ -1660,6 +1661,20 @@ process:
* Returning an instance of another class -- essentially performing the role of a
factory function.
+These steps will have to be performed in the metaclass's :meth:`__new__` method
+-- :meth:`type.__new__` can then be called from this method to create a class
+with different properties. This example adds a new element to the class
+dictionary before creating the class::
+
+ class metacls(type):
+ def __new__(mcs, name, bases, dict):
+ dict['foo'] = 'metacls was here'
+ return type.__new__(mcs, name, bases, dict)
+
+You can of course also override other class methods (or add new methods); for
+example defining a custom :meth:`__call__` method in the metaclass allows custom
+behavior when the class is called, e.g. not always creating a new instance.
+
.. data:: __metaclass__