Implementacja systemu zamówień z kompozycją i dziedziczeniem
Poniższa implementacja łączy obie techniki. Zobacz, jak naturalnie współgrają ze sobą w jednym systemie.
class Adres:
def __init__(self, ulica, miasto, kod):
self.ulica = ulica
self.miasto = miasto
self.kod = kod
def pelny_adres(self):
return f"{self.ulica}, {self.kod} {self.miasto}"
class Produkt:
def __init__(self, nazwa, cena):
self.nazwa = nazwa
self.cena = cena
def opis(self):
return f"{self.nazwa} ({self.cena} PLN)"
class Klient:
def __init__(self, imie, nazwisko, email):
self.imie = imie
self.nazwisko = nazwisko
self.email = email
def dane_klienta(self):
return f"{self.imie} {self.nazwisko} ({self.email})"
class KlientFirmowy(Klient):
def __init__(self, imie, nazwisko, email,
nip, firma):
super().__init__(imie, nazwisko, email)
self.nip = nip
self.firma = firma
def dane_klienta(self):
return f"{self.firma} ({self.imie} {self.nazwisko}, NIP: {self.nip})"
class PozycjaZamowienia:
def __init__(self, produkt, ilosc):
self.produkt = produkt
self.ilosc = ilosc
def suma(self):
return self.produkt.cena * self.ilosc
def opis(self):
return f"{self.produkt.nazwa} x {self.ilosc} = {self.suma()} PLN"
class Zamowienie:
def __init__(self, klient, adres):
self.klient = klient
self.adres = adres
self.pozycje = []
self.status = "nowe"
def dodaj(self, produkt, ilosc):
self.pozycje.append(PozycjaZamowienia(produkt, ilosc))
def calkowita_kwota(self):
return sum(p.suma() for p in self.pozycje)
def podsumowanie(self):
linie = [f"Zamowienie dla: {self.klient.dane_klienta()}"]
linie.append(f"Adres: {self.adres.pelny_adres()}")
linie.append("Pozycje:")
for p in self.pozycje:
linie.append(f" - {p.opis()}")
linie.append(f"Razem: {self.calkowita_kwota()} PLN")
linie.append(f"Status: {self.status}")
return "\n".join(linie)
produkt1 = Produkt("Laptop", 3500)
produkt2 = Produkt("Mysz", 120)
klient = Klient("Anna", "Nowak", "anna@example.com")
adres = Adres("Główna 1", "Poznań", "60-001")
zamowienie = Zamowienie(klient, adres)
zamowienie.dodaj(produkt1, 1)
zamowienie.dodaj(produkt2, 2)
print(zamowienie.podsumowanie())