Data Classes in Python | Set 4 (Inheritance)

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.

filter_none

edit
close

play_arrow

link
brightness_4
code

from dataclasses import dataclass
  
  
@dataclass
class Article:
      
    title: str
    content: str
    author: str
  
  
@dataclass
class GfgArticle(Article):
      
    language: str
    author: str
    upvotes: int = 0

chevron_right


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 overidden 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.

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    dClassObj = GfgArticle("DataClass",
                           "SuperCool DataStructure",
                           "vibhu4agarwal",
                           "Python3")
    print(dClassObj)

    chevron_right

    
    

    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).
  • filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    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)

    chevron_right

    
    

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.


My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.




Article Tags :

Be the First to upvote.


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.