diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 24c647d1a8d..79fde4bdc79 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -1998,46 +1998,14 @@ becomes the :attr:`~object.__dict__` attribute of the class object. Describes the implicit ``__class__`` closure reference -Metaclass example -^^^^^^^^^^^^^^^^^ +Uses for metaclasses +^^^^^^^^^^^^^^^^^^^^ The potential uses for metaclasses are boundless. Some ideas that have been explored include enum, logging, interface checking, automatic delegation, automatic property creation, proxies, frameworks, and automatic resource locking/synchronization. -Here is an example of a metaclass that uses an :class:`collections.OrderedDict` -to remember the order that class variables are defined:: - - class OrderedClass(type): - - @classmethod - def __prepare__(metacls, name, bases, **kwds): - return collections.OrderedDict() - - def __new__(cls, name, bases, namespace, **kwds): - result = type.__new__(cls, name, bases, dict(namespace)) - result.members = tuple(namespace) - return result - - class A(metaclass=OrderedClass): - def one(self): pass - def two(self): pass - def three(self): pass - def four(self): pass - - >>> A.members - ('__module__', 'one', 'two', 'three', 'four') - -When the class definition for *A* gets executed, the process begins with -calling the metaclass's :meth:`__prepare__` method which returns an empty -:class:`collections.OrderedDict`. That mapping records the methods and -attributes of *A* as they are defined within the body of the class statement. -Once those definitions are executed, the ordered dictionary is fully populated -and the metaclass's :meth:`__new__` method gets invoked. That method builds -the new type and it saves the ordered dictionary keys in an attribute -called ``members``. - Customizing instance and subclass checks ----------------------------------------