Search code examples
pythonpython-3.xabstract-classabstractabc

No error while instantiating abstract class, even though abstract method is not implemented


I was trying out the below python code:

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()

I thought having @abstractmethod will ensure that my parent class will be abstract and the child class would also be abstract as it is not implementing the abstract method. But here, I get no error trying to instantiate both the classes.

Can anyone explain why?


Solution

  • You must set meta-class of Bar class to ABCMeta.

    Python 2:

    class Bar:
        __metaclass__ = ABCMeta
    
        @abstractmethod
        def foo(self):
            pass
    

    Python 3:

    class Bar(object, metaclass=ABCMeta):
        @abstractmethod
        def foo(self):
            pass