Зачем использовать встроенные функции 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).