Python Topics : Abstract Classes
Working on Python Abstract classes
By default Python does not provide abstract classes
Python comes with the ABC module which provides the base for defining Abstract Base classes(ABC)
ABC works by decorating methods of the base class as an abstract
then registering concrete classes as implementations of the abstract base
a method becomes abstract when decorated with the keyword @abstractmethod
# Python program showing
# abstract base class work
from abc import ABC, abstractmethod

class Polygon(ABC):
    @abstractmethod
    def noofsides(self):
        pass

class Triangle(Polygon):
    # overriding abstract method
    def noofsides(self):
        print("I have 3 sides")

class Pentagon(Polygon):
    # overriding abstract method
    def noofsides(self):
        print("I have 5 sides")

class Hexagon(Polygon):
    # overriding abstract method
    def noofsides(self):
        print("I have 6 sides")

class Quadrilateral(Polygon):
    # overriding abstract method
    def noofsides(self):
        print("I have 4 sides")

# Driver code
R = Triangle()
R.noofsides()

K = Quadrilateral()
K.noofsides()

R = Pentagon()
R.noofsides()

K = Hexagon()
K.noofsides()
Implementation of Abstract through Subclass
by subclassing directly from the base, can avoid the need to register the class explicitly
the Python class management is used to recognize Plugin implementation as implementing the abstract PluginBase
# Python program showing
# implementation of abstract
# class through subclassing
import abc

class parent:       
    def geeks(self):
        pass

class child(parent):
    def geeks(self):
        print("child class")

# Driver code
print( issubclass(child, parent)) # True
print( isinstance(child(), parent)) # True
a side-effect of using direct subclassing is, it is possible to find all the implementations of the plugin by asking the base class for the list of known classes derived from it
Concrete Methods in Abstract Base Classes
abstract classes may contain both concrete methods and abstract methods
the concrete class provides an implementation of abstract methods
the abstract base class can also provide an implementation
can invoke the methods in abstract classes by using super()
# Python program invoking a 
# method using super()
from abc import ABC

class R(ABC):
    def rk(self):
        print("Abstract Base Class")

class K(R):
    def rk(self):
        super().rk()
        print("subclass")

# Driver code
r = K()
r.rk()
Abstract Properties in Python
abstract classes include attributes/properties
can require the attributes in concrete classes by defining them with @abstractproperty
# Python program showing
# abstract properties

import abc
from abc import ABC, abstractmethod

class parent(ABC):
    @abc.abstractproperty
    def geeks(self):
        return "parent class"

class child(parent):
    @property
    def geeks(self):
        return "child class"

try:
    r = parent()
    print(r.geeks)
except Exception as err:
    print(err)

r = child()
print(r.geeks)
an error is generated by trying to instantiate the abstract class
index