Open In App

__init_subclass__ in Python

Last Updated : 22 Jun, 2020
Improve
Improve
Like Article
Like
Save
Share
Report

Prerequisites: Python Classes and Objects, Inheritance in Python

Regardless of any programming languages, Inheritance is one of the most important topics in Object-Oriented Programming Concepts. Inheritance is a concept of defining a class in terms of another class. As per inheritance, we know that a superclass reference can hold its subclass reference. We all know that the behavior of the superclass can be altered according to the implementation of its sub-class(es).

But now, we can alter the behavior of the sub-class(es) by using __init_subclass__

__init_subclass__




# defining a SuperClass
class SuperClass:
  
     # defining __init_subclass__ method
    def __init_subclass__(cls, **kwargs):
        cls.default_name ="Inherited Class"
  
# defining a SubClass
class SubClass(SuperClass):
  
     # an attribute of SubClass
    default_name ="SubClass" 
    print(default_name)
  
subclass = SubClass()
print(subclass.default_name)


Output :

SubClass
Inherited Class

Understanding the code

  • In the above example, there are 2 classes(i.e Super Class and SubClass) and SubClass is inherited from SuperClass. default_name is an attribute of SubClass.
  • The value of attribute default_name is altered by SuperClass by using __init_subclass__ method.
  • cls is referred to the subclass(es) which are inherited. Keyword arguments(**kwargs) which are given to a new class are passed to the parent’s class __init_subclass__.
  • For compatibility with other subclasses using __init_subclass__, one should take out the needed keyword arguments and pass the others over to the base class(Super Class).

This __init_subclass__ closely look alike Decorator class. But where class decorators only affect the specific class they are applied to, __init_subclass__ solely applies to future sub-classes of the class defining the method. It means we can alter/define the behavior of any new classes which are inherited from super-class.
Example:




# defining a SuperClass
class SuperClass:
    def __init_subclass__(cls, default_name, **kwargs):
        cls.default_name = default_name
  
# defining a subclass
class SubClass1(SuperClass, default_name ="SubClass1"):
    pass
  
# defining another subclass
class SubClass2(SuperClass, default_name ="SubClass2"):
    default_name = "InheritedClass"
  
  
# references for subclasses
subClass1 = SubClass1()
subClass2 = SubClass2()
  
print(subClass1.default_name)
print(subClass2.default_name)


Output :

SubClass1
SubClass2

By this we can conclude that __init_subclass__ method is used to alter the behavior of subclasses which may be created in future.



Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads