python' function parameter syntax provides all the tools we need to do thisbut it makes the overall code look cumbersome have look at the proper version of the friend multiple inheritance codeclass contactall_contacts [def __init__(selfname=''email=''**kwargs)super(__init__(**kwargsself name name self email email self all_contacts append(selfclass addressholderdef __init__(selfstreet=''city=''state=''code=''**kwargs)super(__init__(**kwargsself street street self city city self state state self code code class friend(contactaddressholder)def __init__(selfphone=''**kwargs)super(__init__(**kwargsself phone phone we've changed all arguments to keyword arguments by giving them an empty string as default value we've also ensured that **kwargs parameter is included to capture any additional parameters that our particular method doesn' know what to do with it passes these parameters up to the next class with the super call if you aren' familiar with the **kwargs syntaxit basically collects any keyword arguments passed into the method that were not explicitly listed in the parameter list these arguments are stored in dictionary named kwargs (we can call the variable whatever we likebut convention suggests kwor kwargswhen we call different method (for examplesuper(__init__with **kwargs syntaxit unpacks the dictionary and passes the results to the method as normal keyword arguments we'll cover this in detail in python object-oriented shortcuts