Ошибка 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.