2015-02-24 1 views
2

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

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 будет гарантировать, что мой родительский класс будет абстрактным и класс ребенка также будет абстрактным, поскольку он не реализует абстрактный метод. Но здесь у меня нет ошибки, пытающейся создать экземпляр обоих классов.

Может ли кто-нибудь объяснить, почему?

+0

я получил исключение 'б = Bar() TypeError: Невозможно создать абстрактный класс Bar с абстрактными методами Foo' –

+0

@TanveerAlam Даже я удивлен ... Я не получаю ошибку ... это из-за версии? Я использую 3.4 – codingsplash

ответ

5

Вы должны комплект meta-class от 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 
+0

Кроме того, для повышения ошибки должен быть хотя бы один абстрактный метод, как в ваших примерах. –

Смежные вопросы