Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting all attributes to appear on python's `__dict__` method

Please consider the following python example:

In [3]: class test(object):
   ...:     attribute='3'
   ...:     def __init__(self):
   ...:         self.other='4'
   ...:         

In [4]: b=test()

In [5]: b.attribute
Out[5]: '3'

In [6]: b.__dict__
Out[6]: {'other': '4'}

Why is it that __dict__ only shows the "other" attribute and not "atribute"?

And how do I get a dictionary with all the classe's attributes and values? That is, how do I get this?

{'other': '4', 'attribute': '3'}

And I mean by using __dict__ or by some other simple means.

PS: related to this question, but couldn't quite get a dict from there.

PS2: I'm not look for test.__dict__ or b.__class__.__dict__, I'm looking for something that can be used as

In [3]: class test(object):
   ...:     attribute='3'
   ...:     def __init__(self):
   ...:         self.other='4'
   ...:     def _print_atr(self):
   ...:         # This should print exactly {'other': '4', 'attribute': '3'}
   ...:         print(self.__all_atr__)

In [4]: b=test()

In [5]: b.attribute
Out[5]: '3'

In [6]: b.__dict__
Out[6]: {'other': '4'}

Cheers

like image 806
TomCho Avatar asked Jul 13 '16 22:07

TomCho


1 Answers

attribute is not an instance attribute but a class attribute (can be seen in the mappingproxy test.__dict__).

You can get attribute in the instance __dict__ if you update the value of attribute from the instance:

>>> b = test()
>>> b.__dict__
{'other': '4'}
>>> b.attribute
'3'
>>> b.attribute = 5
>>> b.__dict__
{'attribute': 5, 'other': '4'}

Or keep the original value with

>>> b.attribute  = b.__class__.attribute # may not be necessary

Or you could change the definition of the class and move attribute into one of the class methods and bind it to the instance via self.

like image 165
Moses Koledoye Avatar answered Sep 28 '22 16:09

Moses Koledoye