Open In App

Data Classes in Python | Set 4 (Inheritance)

Last Updated : 06 Jul, 2022
Comments
Improve
Suggest changes
Like Article
Like
Report
Prerequisites: Inheritance In Python, Data Classes in Python | Set 3 In this post, we will discuss how DataClasses behave when inherited. Though they make their own constructors, DataClasses behave pretty much the same way as normal classes do when inherited. Python3 1==
from dataclasses import dataclass


@dataclass
class Article:
    
    title: str
    content: str
    author: str


@dataclass
class GfgArticle(Article):
    
    language: str
    author: str
    upvotes: int = 0
Few points from above code:
  1. Article is subclassed by GfgArticle
  2. Both SuperClass and SubClass are DataClasses - although super-class or sub-class being a normal class is also possible. When a DataClass inherits a normal class, the __init__() from the super-class is overridden in sub-class.
  3. author in GfgArticle overrides the same in Article - As the basic concept of inheritance, the value for its assignment is first looked in the sub-class and followed up the tree in super-class.

Behaviour of __init__() of GfgArticle:
  • If __init__() is not explicitly provided, the default __init__() expects attributes of super-class (Article) followed by attributes of sub-class as parameters.
  • GfgArticle(title: str, content: str, author: str, language: str, upvotes: int = 0)
    Note: The signature expects author before language in-spite of opposite order of declaration in GfgArticle. This comes from the fact that attributes are scanned top to bottom from super-class followed by sub-class. So author is first scanned in Article then language is scanned in GfgArticle. Python3 1==
    dClassObj = GfgArticle("DataClass",
                           "SuperCool DataStructure",
                           "vibhu4agarwal",
                           "Python3")
    print(dClassObj)
    
    Output:
    GfgArticle(title='DataClass', content='SuperCool DataStructure', author='vibhu4agarwal', language='Python3', upvotes=0)
  • If __init__() is explicitly provided, it should somehow initialize all it's own attributes as well as those in the super-class (Article).
  • Python3 1==
    from dataclasses import dataclass
    
    
    @dataclass
    class Article:
        title: str
        content: str
        author: str
    
    
    @dataclass(init = False)
    class GfgArticle(Article):
    
        language: str
        author: str
        upvotes: int = 0
    
        def __init__(self, title):
            self.title = title
            self.language = "Python3"
            self.author = "vibhu4agarwal"
            self.content = "Inheritance Concepts"
    
    
    dClassObj = GfgArticle("DataClass")
    print(dClassObj)
    
Output:
GfgArticle(title='DataClass', content='Inheritance Concepts', author='vibhu4agarwal', language='Python3', upvotes=0)
Note:
  • Parameters requirement in __init__() can be adjusted according to the need as long as it has some way of initializing all the attributes.
  • Order of initialization doesn't matter. language is initialized before author, while content is initialized at last and it still works.

Next Article
Article Tags :
Practice Tags :

Similar Reads