Функция setattr() устанавливает значение атрибута указанного объекта по его имени.
Это аналог функции getattr(). Аргументами являются объект object, строка с именем name атрибута и произвольное значение value устанавливаемого атрибута.
Имя name должно быть именем существующего атрибута или будет создан новый атрибут. Функция присвоит значение атрибуту, если объект позволяет это. Например setattr(x, 'foobar', 123), эквивалентно x.foobar = 123
-Для возвращения атрибута используется getattr().
-Для удаления атрибута используется delattr().
-Для проверки существования атрибута используется hasattr().
🔘 Доступ к атрибутам
Атрибуты объекта в Python – это именованные поля (данные, функции), присущие данному объекту (экземпляру, классу).
Самый простой доступ к атрибутам – через точку:
Если мы обратимся к атрибуту, которого нет, то получим ошибку AttributeError. Мы можем переопределить это поведение путем реализации магических методов __getattr__ или __getattribute__.
__getattr__ вызывается, если атрибут не найден обычным способом (не был задан ранее через точку, функцию setattr, или через __dict__). Если атрибут найден, то __getattr__ НЕ вызывается.
📎 Пример. Возвращаем -1 для любого несуществующего атрибута.
Метод __getattribute__ вызывается, когда мы пытаемся получить любой атрибут, не зависимо от того, есть он или нет. Этот метод, вызывается прежде __getattr__. Он немного хитрее. Если __getattribute__ кидает AttributeError, то будет вызвана __getattr__.
📎 Пример. Мы можем запретить чтение каких-то атрибутов:
⚠️ Внимание! В __getattribute__ мы можем вызвать super().__getattribute__(item) или object.__getattribute__(self, item), что посути тоже самое, но не слудует делать return self.__dict__[item] или return self.__getattribute__(item) или return getattr(self, item), так как это приведет к бесконечной рекурсии.
💡 Также есть магический метод __setattr__(self, key, value), вызываемый при obj.key = value или setattr(obj, 'key', value). У него нет более длинно-названного брата-близнеца.
Для полноты картины еще есть встроенная функция getattr(object, name[, default]). Вызов getattr(x, 'y') аналогичен обращению через точку: x.y В первом случае 'y' – это строка, что позволяет нам динамически получать атрибуты объектов, в отличие от точки, которая требует фиксированного имени на этапе написания кода. В случае, если атрибут недоступен мы получим AttributeError при незаданном default или получим default (без возникновения ошибки), если default был задан третьим аргументом.
#python
#machinelearning #artificialintelligence #ai #datascience #programming #technology #deeplearning