💻 Примеры

⚡ Главный пример

Система чеков с наследованием и система уведомлений на миксинах.

Система чеков

# receipts_demo.py
class Receipt:
    def __init__(self, receipt_id: int, amount: float) -> None:
        self.id = receipt_id
        self.amount = amount

    def __str__(self) -> str:
        return f"{self.__class__.__name__} {self.id}: {self.amount}"


class SaleReceipt(Receipt):
    def __init__(self, receipt_id: int, amount: float) -> None:
        if amount <= 0:
            raise ValueError("SaleReceipt amount must be positive.")
        super().__init__(receipt_id, amount)

    def __str__(self) -> str:
        return f"{self.__class__.__name__} {self.id}: +{self.amount}"


class ReturnReceipt(Receipt):
    def __init__(self, receipt_id: int, amount: float) -> None:
        if amount >= 0:
            raise ValueError("ReturnReceipt amount must be negative.")
        super().__init__(receipt_id, amount)

    def __str__(self) -> str:
        return f"{self.__class__.__name__} {self.id}: {self.amount}"


sale = SaleReceipt(1, 100.0)
ret = ReturnReceipt(2, -50.0)
print(sale)  # SaleReceipt 1: +100.0
print(ret)   # ReturnReceipt 2: -50.0

Класс Shift

class Shift:
    _id_counter = 1

    def __init__(self) -> None:
        self.id = Shift._id_counter
        Shift._id_counter += 1
        self.receipts: list[Receipt] = []
        self.closed = False

    def is_closed(self) -> bool:
        return self.closed

    def close(self) -> None:
        self.closed = True

    def add_receipt(self, amount: float) -> None:
        if self.closed:
            raise ValueError("Cannot add receipt to closed shift.")
        receipt_id = len(self.receipts) + 1
        self.receipts.append(SaleReceipt(receipt_id, amount))

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

Система уведомлений

class EmailNotifyMixin:
    def email_notify(self, message: str) -> None:
        if not hasattr(self, "email"):
            raise AttributeError("Missing 'email'")
        print(f"Email to {self.email}: {message}")


class SmsNotifyMixin:
    def sms_notify(self, message: str) -> None:
        if not hasattr(self, "phone"):
            raise AttributeError("Missing 'phone'")
        print(f"SMS to {self.phone}: {message}")


class PushNotifyMixin:
    def push_notify(self, message: str) -> None:
        print(f"Push notification: {message}")


class User:
    def __init__(self, name: str) -> None:
        self.name = name


class Courier(User, EmailNotifyMixin, SmsNotifyMixin):
    def __init__(self, name: str, email: str, phone: str) -> None:
        super().__init__(name)
        self.email = email
        self.phone = phone

    def notify(self, message: str) -> None:
        self.email_notify(message)
        self.sms_notify(message)


class Admin(User, PushNotifyMixin):
    def notify(self, message: str) -> None:
        self.push_notify(message)


courier = Courier("Alice", "alice@example.com", "+123456789")
courier.notify("Package delivered.")

admin = Admin("Bob")
admin.notify("New report available.")