diff options
author | Andrés Delfino <adelfino@gmail.com> | 2018-11-16 11:41:55 (GMT) |
---|---|---|
committer | INADA Naoki <methane@users.noreply.github.com> | 2018-11-16 11:41:55 (GMT) |
commit | c2ccac7b9f9a1132ca36255b0ddfeecef4371aa3 (patch) | |
tree | 3c8f47fb44f6ff8ee0bf4f35ab69915bc3c2781e /Doc/reference | |
parent | 37cd982df02795905886ab36a2378ed557cb6f60 (diff) | |
download | cpython-c2ccac7b9f9a1132ca36255b0ddfeecef4371aa3.zip cpython-c2ccac7b9f9a1132ca36255b0ddfeecef4371aa3.tar.gz cpython-c2ccac7b9f9a1132ca36255b0ddfeecef4371aa3.tar.bz2 |
bpo-33816: Remove outdated metaclass example (GH-7566)
Diffstat (limited to 'Doc/reference')
-rw-r--r-- | Doc/reference/datamodel.rst | 36 |
1 files changed, 2 insertions, 34 deletions
diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 24c647d..79fde4b 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 ---------------------------------------- |