Skip to content

🥕📝 Zadania cz. 1

Przygotowanie repozytorium

Zanim zaczniesz pracę, zsynchronizuj swoje lokalne repozytorium z najnowszymi zmianami:

  1. Wejdź do swojego zdalnego repozytorium.
  2. Odszukaj pull request i zaakceptuj go (merge do gałęzi main).
  3. Wróć do lokalnego repozytorium i zaktualizuj gałąź main:
    git checkout main
    git pull
    
  4. Na zaktualizowanej gałęzi main stwórz swoją gałąź roboczą na te zajęcia:
    git checkout -b zaj03
    

Od teraz pracuj na gałęzi zaj03.


Przykład

Wejdź do repozytorium, zapoznaj się z gotowym kodem w pliku main_zaj03.py oraz modułami w folderze python1course/zaj03.

Zwróć uwagę na:

  • Tworzenie konstruktorów - __init__,
  • Dodawanie metod,
  • Tekstową reprezentację klas - __str__ oraz __repr__ (jako przykład przeciążania operatorów),
  • Atrybut klasy __instances_count - współdzielony przez wszystkie instancje, zlicza utworzone karetki (patrz: Atrybuty klasy vs instancji),
  • Użycie isinstance() w metodzie __eq__ - sprawdza, czy drugi operand jest w ogóle instancją Ambulance przed porównaniem (patrz: Introspekcja),
  • Właściwość status zdefiniowaną przez @property - setter waliduje dozwolone wartości i rzuca ValueError dla nieprawidłowych (patrz: Metody - @property).

📝 Zadania

Zaimplementuj dwie klasy w module personnel: Employee oraz Driver. Stwórz odpowiednie pliki w katalogu python1course/zaj03/personnel/.

Klasa Employee

Utwórz klasę Employee w pliku employee.py z następującymi wymaganiami:

  1. Konstruktor (__init__): Powinien przyjmować następujące parametry:
  2. first_name (str) - imię pracownika
  3. last_name (str) - nazwisko pracownika
  4. employee_id (int) - unikalny identyfikator pracownika
  5. salary (float) - wynagrodzenie pracownika

  6. Metody:

  7. display_info() - powinna wyświetlać informacje o pracowniku w formacie:
    Employee ID: {employee_id}, Name: {first_name} {last_name}, Salary: {salary} zł
    
  8. update_salary(new_salary) - powinna aktualizować wynagrodzenie pracownika i wyświetlać komunikat: Updated salary: {new_salary}

  9. Metody specjalne:

  10. __str__() - powinna zwracać czytelną reprezentację tekstową obiektu w formacie: Employee({first_name} {last_name}, ID: {employee_id})
  11. __repr__() - powinna zwracać jednoznaczną reprezentację obiektu w formacie: Employee('{first_name}', '{last_name}', {employee_id}, {salary})

Klasa Driver

Utwórz klasę Driver w pliku driver.py, która dziedziczy po klasie Employee. Klasa powinna spełniać następujące wymagania:

  1. Konstruktor (__init__): Powinien przyjmować wszystkie parametry z klasy Employee oraz dodatkowo:
  2. license_number (str) - numer licencji kierowcy
  3. qualifications (list) - lista kwalifikacji kierowcy (lista stringów)

  4. Wykorzystanie dziedziczenia: W konstruktorze wywołaj konstruktor klasy bazowej Employee, używając jednej z poniższych metod:

    # Metoda 1: bezpośrednie wywołanie
    Employee.__init__(self, first_name, last_name, employee_id, salary)
    
    # Metoda 2: używając super() (zalecane)
    super().__init__(first_name, last_name, employee_id, salary)
    

  5. Przeciążenie metody display_info(): Nadpisz metodę display_info() z klasy bazowej tak, aby zwracała string (zamiast wyświetlać) w formacie:

    Driver ID: {employee_id}, Name: {first_name} {last_name}, Salary: {salary}, License Number: {license_number}, Qualifications: {qualifications_joined}
    
    gdzie qualifications_joined to kwalifikacje połączone przecinkiem (np. ', '.join(self.qualifications)).

  6. Metody specjalne:

  7. __str__() - powinna zwracać czytelną reprezentację tekstową obiektu w formacie: Driver({first_name} {last_name}, ID: {employee_id}, License: {license_number})
  8. __repr__() - powinna zwracać jednoznaczną reprezentację obiektu w formacie: Driver('{first_name}', '{last_name}', {employee_id}, {salary}, '{license_number}', {qualifications})

Plik __init__.py

Zaktualizuj plik __init__.py w katalogu personnel/, aby eksportował obie klasy:

from .employee import Employee
from .driver import Driver

__all__ = ["Employee", "Driver"]

Przykładowe użycie

Po zaimplementowaniu klas i odkomentowaniu kodu w main_zaj03.py, plik ten powinien się uruchamiać bez błędów. Można też dodać swój kod, żeby zaprezentować działanie poszczególnych funkcjonalności.

Uwagi

  • Zwróć uwagę na poprawną inicjalizację klasy bazowej w konstruktorze klasy pochodnej.
  • Upewnij się, że metoda display_info() w klasie Employee wyświetla informacje (print()), a w klasie Driver zwraca string.
  • Zaimplementuj zarówno __str__() jak i __repr__() dla obu klas zgodnie z podanymi formatami.