Нет ошибок при создании экземпляра абстрактного класса, даже если абстрактный метод не реализован

Я пробовал следующий код Python:

from abc import ABCMeta, abstractmethod

class Bar:

    __metaclass__ = ABCMeta

    @abstractmethod
    def foo(self):
        pass


class Bar2(Bar):
    def foo2(self):
        print("Foo2")


b = Bar()
b2 = Bar2()

Я думал, что наличие @abstractmethod гарантирует, что мой родительский класс будет абстрактным, а дочерний класс также будет абстрактным, поскольку он не реализует абстрактный метод. Но здесь я не получаю ошибки при попытке создать экземпляры обоих классов.

Кто-нибудь может объяснить почему?


person codingsplash    schedule 24.02.2015    source источник
comment
У меня есть исключение b=Bar() TypeError: Can't instantiate abstract class Bar with abstract methods foo   -  person Tanveer Alam    schedule 24.02.2015
comment
@TanveerAlam Даже я удивлен ... Я не получаю сообщение об ошибке ... это из-за версии? Я использую 3.4   -  person codingsplash    schedule 24.02.2015


Ответы (1)


Вы должны установить мета-класс класса Bar на ABCMeta.

Python 2:

class Bar:
    __metaclass__ = ABCMeta

    @abstractmethod
    def foo(self):
        pass

Python 3:

class Bar(object, metaclass=ABCMeta):
    @abstractmethod
    def foo(self):
        pass
person M.javid    schedule 24.02.2015
comment
Кроме того, должен быть хотя бы один абстрактный метод для возникновения ошибки, как в ваших примерах. - person Aleksandar Jovanovic; 05.02.2017