__dict__ {'data ''spam' hola( __dict__ {'data ''eggs''data ''spam'list(sub __dict__ keys()['__qualname__''__module__''__doc__''hola'list(super __dict__ keys()['__module__''hello''__dict__''__qualname__''__doc__''__weakref__' __dict__ {notice the extra underscore names in the class dictionariespython sets these automaticallyand we can filter them out with the generator expressions we saw in and that we won' repeat here most are not used in typical programsbut there are tools that use some of them ( __doc__ holds the docstrings discussed in alsoobserve that ya second instance made at the start of this seriesstill has an empty namespace dictionary at the endeven though ' dictionary has been populated by assignments in methods againeach instance has an independent namespace dictionarywhich starts out empty and can record completely different attributes than those recorded by the namespace dictionaries of other instances of the same class because attributes are actually dictionary keys inside pythonthere are really two ways to fetch and assign their values--by qualificationor by key indexingx data __dict__['data '('spam''spam' data 'toastx __dict__ {'data ''eggs''data ''toast''data ''spam' __dict__['data ''hamx data 'hamthis equivalence applies only to attributes actually attached to the instancethough because attribute fetch qualification also performs an inheritance searchit can access inherited attributes that namespace dictionary indexing cannot the inherited attribute hellofor instancecannot be accessed by __dict__['hello'experiment with these special attributes on your own to get better feel for how namespaces actually do their attribute business also try running these objects through the dir function we met in the prior two --dir(xis similar to __dict__ keys()but dir sorts its list and includes some inherited and built-in atnamespacesthe conclusion