Skip to content
Related Articles

Related Articles

Data Classes in Python | Set 5 (post-init)

View Discussion
Improve Article
Save Article
  • Last Updated : 15 Apr, 2019

Prerequisite: Data Classes in Python | Set 4

In this post, we will discuss how to modify values of some attributes during object creation without coding it in __init__() by using post-init processing.

__post_init__(): This function when made, is called by in-built __init__() after initialization of all the attributes of DataClass. Basically, object creation of DataClass starts with __init__() (constructor-calling) and ends with __post__init__() (post-init processing).

Use –
This feature is very handy at times when certain attributes are dependent on the parameters passed in the __init__() but do not get their values directly from them. That is, they get their values after performing some operation on a subset of arguments received in the constructor.

Continuing the same example we’ve been seeing in this series of articles, suppose there is an attribute called author_name which gets its value from the profile handle to name mapping in the defined dictionary name.
So author_name is dependent on profile handle which author attribute receives, so using __post_init__() should be an ideal choice this case.

from dataclasses import dataclass, field
name = {'vibhu4agarwal': 'Vibhu Agarwal'}
class GfgArticle:
    title : str
    language: str
    author: str
    author_name: str = field(init = False)
    upvotes: int = 0
    def __post_init__(self):
        self.author_name = name[]
dClassObj = GfgArticle("DataClass", "Python3", "vibhu4agarwal")


GfgArticle(title=’DataClass’, language=’Python3′, author=’vibhu4agarwal’, author_name=’Vibhu Agarwal’, upvotes=0)

Can default_factory be an alternative?
No, because default_factory accepts zero argument function or callable, so it can’t receive any arguments and return a value after performing some operations on them.

My Personal Notes arrow_drop_up
Recommended Articles
Page :

Start Your Coding Journey Now!