🐛 Типичные ошибки

⚡ Кратко

  • Не забывайте super().__init__() в наследниках.
  • Проверяйте закрытие смены перед добавлением чека.
  • Используйте isinstance, а не type(...) ==.

Ошибка 1. Пропуск super().__init__()

class SaleReceipt(Receipt):
    def __init__(self, receipt_id, amount):
        if amount <= 0:
            raise ValueError("...")
        # забыли super().__init__(receipt_id, amount)

Почему плохо: объект не получит поля id и amount.

Исправление: всегда вызывайте super().__init__(...) после валидации.

Ошибка 2. Добавление чека в закрытую смену

def add_receipt(self, amount):
    receipt_id = len(self.receipts) + 1
    self.receipts.append(SaleReceipt(receipt_id, amount))

Почему плохо: позволяет изменять закрытую смену.

Исправление: добавьте guard clause в начало метода.

if self.closed:
    raise ValueError("Cannot add receipt to closed shift.")

Ошибка 3. Проверка типа через ==

if type(receipt) == SaleReceipt:  # не учитывает наследников
    ...

Исправление: используйте isinstance(receipt, SaleReceipt).

Ошибка 4. Миксин без проверки поля

class EmailNotifyMixin:
    def email_notify(self, message):
        print(f"Email to {self.email}: {message}")  # может не быть email

Исправление: проверяйте наличие поля через hasattr и выбрасывайте AttributeError.