There are 3 magic python build in functions that may help a lot: setattr, getattr, hasattr responsible for setting, getting named class attributes and checking if they exist, respectively.
A simple example to get familiar how it works:
>>> class A():This is quite intuitive, you may use these methods to update class attributes according to a dict:
... pass
...
>>> my_cls = A()
>>> hasattr(my_cls, 'test_attr')
False
>>> my_cls.test_attr
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: A instance has no attribute 'test_attr'
>>> setattr(my_cls, 'test_attr', 'some value')
>>> hasattr(my_cls, 'test_attr')
True
>>> my_cls.test_attr
'some value'
>>> getattr(my_cls, 'test_attr', 'default_value')
'some value'
>>> my_dict = {'attr1': 1, 'attr2' : 5, 'attr3' : 10}
>>> for k,v in my_dict.items():
... setattr(my_cls, k, v)
...
>>> my_cls.attr1
1
>>> getattr(my_cls, "attr3", -1)
10
>>> getattr(my_cls, "attr4", -1)
-1
Since getattr supports default values, you can manage without using hasattr.
These functions are great, when you can't predict what attributes you will need to access or when you are not sure whether some attributes are set. A good usage example are global configuration files. For example in django:
from django.conf import settings
some_param = getattr(settings, 'MY_CONF_PARAM', 100)
Just keep in mind that using by using setattr you may override ANY attribute, so make sure you implement some validation mechanisms. And if you ever need it - deleting attributes is also possible, try delattr.
~KR
Why using these functions is better than using simple object.__dict__ ?
ReplyDeleteThanks for the comment. If you need speed i guess accessing __dict__ is the way to go. However it's just raw attribute modification, sometimes getting / setting / deleting an attribute may have some consequences, objects may implement __getattr__, __setattr__, __delattr__, __getattribue__ functions that are executed conditionally or unconditionally.
DeleteCheers!