⚡ Главный пример
Система чеков с наследованием и система уведомлений на миксинах.
Система чеков
# 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.")