From 46fa7a60e08fc7486ecab726af93fa2cfe225305 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 16 Nov 2018 03:58:09 -0800 Subject: bpo-33816: Remove outdated metaclass example (GH-7566) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit c2ccac7b9f9a1132ca36255b0ddfeecef4371aa3) Co-authored-by: Andrés Delfino --- Doc/reference/datamodel.rst | 36 ++---------------------------------- 1 file changed, 2 insertions(+), 34 deletions(-) diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 18067c2..abf0635 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -1918,46 +1918,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 ---------------------------------------- -- cgit v0.12