Create a base class with a metaclass.
(meta, *bases)
| 859 | |
| 860 | |
| 861 | def with_metaclass(meta, *bases): |
| 862 | """Create a base class with a metaclass.""" |
| 863 | # This requires a bit of explanation: the basic idea is to make a dummy |
| 864 | # metaclass for one level of class instantiation that replaces itself with |
| 865 | # the actual metaclass. |
| 866 | class metaclass(type): |
| 867 | |
| 868 | def __new__(cls, name, this_bases, d): |
| 869 | if sys.version_info[:2] >= (3, 7): |
| 870 | # This version introduced PEP 560 that requires a bit |
| 871 | # of extra care (we mimic what is done by __build_class__). |
| 872 | resolved_bases = types.resolve_bases(bases) |
| 873 | if resolved_bases is not bases: |
| 874 | d['__orig_bases__'] = bases |
| 875 | else: |
| 876 | resolved_bases = bases |
| 877 | return meta(name, resolved_bases, d) |
| 878 | |
| 879 | @classmethod |
| 880 | def __prepare__(cls, name, this_bases): |
| 881 | return meta.__prepare__(name, bases) |
| 882 | return type.__new__(metaclass, 'temporary_class', (), {}) |
| 883 | |
| 884 | |
| 885 | def add_metaclass(metaclass): |