New submission from Talha Ahmed <talha.ah...@gmail.com>:

I have been experimenting a little with the `abc` module in python. A la

    >>> import abc

In the normal case you expect your ABC class to not be instantiated if it 
contains an unimplemented `abstractmethod`. You know like as follows:

    >>> class MyClass(metaclass=abc.ABCMeta):
    ...     @abc.abstractmethod
    ...     def mymethod(self):
    ...         return -1
    ...
    >>> MyClass()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: Can't instantiate abstract class MyClass with abstract methods 
mymethod

OR for any derived Class. It all seems to work fine until you inherit from 
something ... say `dict` or `list` as in the following: 

    >>> class YourClass(list, metaclass=abc.ABCMeta):
    ...     @abc.abstractmethod
    ...     def yourmethod(self):
    ...         return -1
    ...
    >>> YourClass()
    []

This is inconsistent because `type` is supposed to be the primary factory.

    >>> type(abc.ABCMeta)
    <class 'type'>
    >>> type(list)
    <class 'type'>

Why is the check for `__abstractmethods__` only implemented for `object_new` 
and not for other built-in types?

----------
components: Interpreter Core
messages: 350264
nosy: Talha Ahmed
priority: normal
severity: normal
status: open
title: No Instantiation Restrictions for AbstractBaseClasses derived from 
builtin types
type: behavior
versions: Python 2.7, Python 3.5, Python 3.6, Python 3.7, Python 3.8, Python 3.9

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue37927>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to