Зачем использовать встроенные функции setattr() и getattr()?
Из чтения документов я точно понимаю, что getattr() и setattr(). Но он также явно говорит, что getattr(x, 'foobar') эквивалентен x.foobar, а setattr(x, 'foobar', 123) эквивалентен x.foobar = 123.
Так почему я должен их использовать?
Ответ 1
Поскольку вы также можете использовать динамическую переменную:
somevar = 'foo'
getattr(x, somevar)
Вы не можете сделать это с помощью регулярного синтаксиса доступа к атрибутам.
Обратите внимание, что getattr() также принимает необязательное значение по умолчанию, которое должно быть возвращено, если атрибут отсутствует:
>>> x = object()
>>> getattr(x, 'foo')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'foo'
>>> getattr(x, 'foo', 42)
42
Используя getattr(), вы можете вытащить имя атрибута из чего-то другого, а не буквала:
for attrname in dir(x):
print('x.{} = {!r}'.format(attrname, getattr(x, attrname))
или вы можете использовать setattr() для установки динамических атрибутов:
for i, value in enumerate(dynamic_values):
setattr(i, 'attribute{}'.format(i), value)
Ответ 2
Вы используете их, если атрибут, к которому вы хотите получить доступ, является переменной, а не литеральной строкой. Они позволяют вам параметризовать доступ/настройку атрибута.
Нет причин делать getattr(x, 'foobar'), но у вас может быть переменная с именем attr, которая может быть установлена на "foobar" или "otherAttr", а затем сделать getattr(x, attr).