⚖️ Старый vs Новый

⚡ Кратко

  • Старый стиль: проверка типа через type(obj) == SaleReceipt.
  • Новый стиль: isinstance(obj, SaleReceipt).
  • Современный код использует type hints и super().

Как показано в исходном материале

Исходный код уже достаточно современен: используются f-strings, наследование, isinstance и hasattr.

Почему можно улучшить

  • Добавить type hints для параметров и возвращаемых значений.
  • Использовать list[Receipt] вместо неявных списков.
  • Заменить проверки type(x) == Class на isinstance(x, Class).

Рекомендуемый современный вариант

def get_total(self, receipt_type: str | None = None) -> float:
    if receipt_type is None:
        return sum(r.amount for r in self.receipts)
    cls = SaleReceipt if receipt_type == "sale" else ReturnReceipt
    return sum(r.amount for r in self.receipts if isinstance(r, cls))

Когда старый подход ещё можно встретить

Явная проверка type(x) == Class встречается в коде, где нужно исключить наследников и проверить именно конкретный класс. Но в большинстве случаев предпочтительнее isinstance.