[Python-ideas] method decorators @final and @override in Python 2.4

Nick Coghlan ncoghlan at gmail.com
Sun Mar 29 03:09:44 CEST 2009

Péter Szabó wrote:
> (One easy way
> to do this right now is saying ``__metaclass__ = type'' in the
> subclass.)

Actually, that doesn't work as you might think...

>>> class TryNotToBeAnABC(FooABC):
...   __metaclass__ = type
>>> type(TryNotToBeAnABC)
<class 'abc.ABCMeta'>

The value assigned to '__metaclass__' (or the metaclass keyword argument
in Py3k) is only one candidate metaclass that the metaclass
determination algorithm considers - the metaclasses of all base classes
are also candidates, and the algorithm picks the one which is a subclass
of all of the candidate classes. If none of the candidates meet that
criteria, then it complains loudly:

>>> class OtherMeta(type): pass
>>> class TryNotToBeAnABC(FooABC):
...   __metaclass__ = OtherMeta
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Error when calling the metaclass bases
    metaclass conflict: the metaclass of a derived class must be a
(non-strict) subclass of the metaclasses of all its bases

And remember, as far as @overrides goes, I believe @abc.abstractmethod
already does what you want - it's only the
@suggest_final/@override_final part of the idea that doesn't exist.


Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia

More information about the Python-ideas mailing list