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?
If you have no abstract method, you will able to instantiate the class. If you have at least one, you will not.
Consider the following code:
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)
which returns:
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.