﻿# OOP_LAB_4_zad_04.py
"""
Rozwiązanie zadania 4: Uniwersalne narzędzia (Wielodziedziczenie i Mixiny)
"""

class LogMixin:
    """
    Klasa domieszki (Mixin).
    Głównym zadaniem Mixina jest wstrzyknięcie (plug-in) specyficznej funkcjonalności
    bez posiadania własnego stanu, a więc nie definiujemy dla niego __init__.
    Nie będzie używany samodzielnie, a jedynie jako dodatek podczas definicji klas.
    """
    
    def log_to_file(self):
        """
        Analizuje dynamicznie obiekt, wyciągając z niego jego stan.
        self.__class__.__name__ to magiczny atrybut zwracający aktualną nazwę klasy używającej mixina.
        self.__dict__ zwraca słownik ze wszystkimi atrybutami (zmiennymi) przechowywanymi w obiekcie.
        """
        nazwa_klasy = self.__class__.__name__
        stan_obiektu = self.__dict__
        print(f"[LOG - {nazwa_klasy}]: {stan_obiektu}")


# Klasy poniżej wykorzystują wielodziedziczenie w połączeniu z Mixinem.
# Zauważ, że w liście dziedziczenia LogMixin powinien znaleźć się na początku.

class User(LogMixin):
    """
    Klasa biznesowa modelująca profil klienta.
    Dziedzicząc po domieszce LogMixin, zyskuje zdolność raportowania.
    """
    def __init__(self, name: str):
        self.name = name

class Order(LogMixin):
    """
    Klasa biznesowa modelująca zamówienie.
    Pomimo że absolutnie nie ma biznesowego powiązania z klasą User (i obie służą
    do diametralnie innych zadań), również współdzieli mechanizm logowania.
    """
    def __init__(self, order_id: int, total: float):
        self.id = order_id
        self.total = total

if __name__ == "__main__":
    print("--- Testowanie logowania za pomocą klas domieszek (Mixinów) ---")
    
    # Stworzenie niezależnych obiektów z unikalnym stanem wewnętrznym
    u = User("admin")
    o = Order(105, 250.0)
    
    # Używamy metody wstrzykniętej za pomocą LogMixin.
    # Widać, że chociaż User ma atrybut 'name' a Order atrybuty 'id' i 'total',
    # nasz uniwersalny Mixin poprawnie zrzucił wszystkie dane w formacie słownika.
    u.log_to_file()
    o.log_to_file()
