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' } @dataclass 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[ self .author] dClassObj = GfgArticle( "DataClass" , "Python3" , "vibhu4agarwal" ) print (dClassObj) |
Output:
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.