(continued from previous pageprint("data descriptor __set__"tryself value value upper(except attributeerrorself value value def __delete__(selfinstance)print("can not delete"class (object)attr datadescriptor( datadescriptor(print( value (print( attrdata descriptor __get__ attr is equivalent to below code print(type(a__dict__['attr'__get__(atype( ))data descriptor __get__ set will upper case the string attr lazy loadingabove / will not display if below line is uncommented attr 'tigertiger print( __dict__{following are the outputs of above three commands data descriptor __set__ data descriptor __set__ {data descriptor __get__ data descriptor __get__ tiger notenote that object 'ddoes not print the 'data descriptor __get__but object of other class prints the message in the other wordsdescriptor can not use there methods by itsown other' class-attributes can use descriptor' methods as shown in above example alsosee the outputs of last three commands we will notice thatnotethe set values are not store in the instance dictionary print( __dict__results in empty dictionary furthera attr and attr 'tigerperforms the set operation immediately (see the __set__ message at outputs)but __get__ operations are performed at the end of the codei first print( __dict__outputs are shown and then get operations is performed lastlyset operation stores only last executed valuei only tiger is printed at the endbut not descriptors