Как действует этот код?

Рейтинг: -1Ответов: 1Опубликовано: 28.03.2023
class Setting:

    def __getattribute__(self, prop):
        out = super().__getattribute__(prop)
        on_body = hasattr(super().__getattribute__('__class__'), prop)
        return out() if callable(out) and not on_body else out

Задание было такое: вы находитесь в процессе создания нового фреймворка. Чтобы повысить гибкость, когда ваш пользователь присваивает значение атрибуту экземпляра, вы хотите дать им возможность вместо этого предоставить вызываемый объект без аргументов. При доступе к атрибуту должно быть возвращено либо назначенное значение (как обычно), либо результат вызова (если он определен как вызываемый).

Создайте класс с именем "Setting", который поддерживает шаблон «Необязательно вызываемый атрибут».

Ответы

▲ 0

Тут вроде всё понятно.

  1. Берём свойство
  2. Если оно callable, но не класс - вызываем, иначе отдаём как есть.

Дело в том, что класс - он тоже callable (чтобы получить экземпляр класса нужно вызвать класс) и поэтому на класс нужно дополнительно проверять и отсеивать эти случаи.

В return тут использован тернарный оператор.