Data Classes in Python | Set 4 (Inheritance) - GeeksforGeeks

12 Apr, 2019
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.
from dataclasses import dataclass    @dataclassclass Article:          title: str    content: str    author: str    @dataclassclass GfgArticle(Article):          language: str    author: str    upvotes: int = 0
Few points from above code:
Article is subclassed by GfgArticleBoth 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.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.
Article is subclassed by GfgArticle
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.
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.dClassObj = GfgArticle("DataClass",                       "SuperCool DataStructure",                       "vibhu4agarwal",                       "Python3")print(dClassObj)Output:GfgArticle(title=’DataClass’, content=’SuperCool DataStructure’, author=’vibhu4agarwal’, language=’Python3′, upvotes=0)
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.
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).from dataclasses import dataclass    @dataclassclass 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)
from dataclasses import dataclass    @dataclassclass 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.
Python
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Python OOPs Concepts
How to Install PIP on Windows ?
Bar Plot in Matplotlib
Defaultdict in Python
Python Classes and Objects
Deque in Python
Check if element exists in list in Python
How to drop one or multiple columns in Pandas Dataframe
Python - Ways to remove duplicates from list
Class method vs Static method in Python