3

It is very surprising to me that I can instantiate an abstract class in python:

from abc import ABC

class Duck(ABC):
    def __init__(self, name):
        self.name = name

if __name__=="__main__":
    d = Duck("Bob")
    print(d.name)

The above code compiles just fine and prints out the expected result. Doesn't this sort of defeat the purpose of having an ABC?

user32882
  • 5,094
  • 5
  • 43
  • 82
  • 2
    If you have no abstract methods, what's the point of using an ABC? – wim Feb 02 '22 at 07:44
  • Good point, but then it would be nice if the docs explicitly stated that the *combination* of `ABC` and `abstractmethod` is what makes a true abstract class in python. – user32882 Feb 02 '22 at 07:48
  • 1
    It's explicitly stated in the [PEP](https://www.python.org/dev/peps/pep-3119/) (search for "_at least one method_"). And it's sort-of stated in the [docs](https://docs.python.org/3/library/abc.html) too ("_...cannot be instantiated unless all of its abstract methods and properties are overridden_" - if there are no abstract methods, then it's actually true that all of them have been overridden) – wim Feb 02 '22 at 09:18

1 Answers1

7

If you have no abstract method, you will able to instantiate the class. if you have at least one, you will not. In code that would read like

from abc import ABC, abstractmethod

class Duck(ABC):
    def __init__(self, name):
        self.name = name

    @abstractmethod
    def implement_me(self):
        ...

if __name__=="__main__":
    d = Duck("Bob")
    print(d.name)

TypeError: Can't instantiate abstract class Duck with abstract method implent_me

It is the combination of the ABC metaclass, and at least one abstractmethod that will lead to you not being able to instantiate a class. If you leave out one of the two, you will be able to do so.

Simon Hawe
  • 3,968
  • 6
  • 14