[Python-ideas] Fwd: Consider allowing the use of abstractmethod without metaclasses
INADA Naoki
songofacandy at gmail.com
Wed Jul 19 21:45:18 EDT 2017
Hi, Neil.
> I want to use abstractmethod, but I have my own metaclasses and I don't want
> to build composite metaclasses using abc.ABCMeta.
>
> Thanks to PEP 487, one approach is to facator out the abstractmethod checks
> from ABCMeta into a regular (non-meta) class. So, my first suggestion is to
> split abc.ABC into two pieces, a parent regular class with metaclass "type":
>
I'm +1 with your idea in performance point of view.
Some people having other language background (C# or Java)
want to use ABC like Java's interface.
But ABC is too heavy to use only for checking abstract methods.
It uses three inefficient WeakSet [1] and it overrides isinstance and issubclass
with slow Python implementation.
[1] WeakSet is implemented in Python, having one __dict__, list and two sets.
And C implementation of gathering abstract methods will reduce
Python startup time too. Because `_collections_abc` module has many ABCs and
`os` module import it.
## in abc.py
# Helper function. ABCMeta use this too.
# And Python 3.7 can have C implementation of this.
def _init_abstractclass(cls, bases=None):
# Compute set of abstract method names
if bases is None:
bases = cls.__bases__
abstracts = {name
for name, value in vars(cls).items()
if getattr(value, "__isabstractmethod__", False)}
for base in bases:
for name in getattr(base, "__abstractmethods__", set()):
value = getattr(cls, name, None)
if getattr(value, "__isabstractmethod__", False):
abstracts.add(name)
cls.__abstractmethods__ = frozenset(abstracts)
class Abstract:
__init_subclass__ = _init_abstractclass
## usage
import abc
class AbstractBar(abc.Abstract):
@abc.abstractmethod
def bar(self): ...
Bests,
INADA Naoki <songofacandy at gmail.com>
More information about the Python-ideas
mailing list