Hierarchia klas - problem

0

Witam, muszę wykonać takie zadanie:
screenshot-20200418193630.png
Mam problem z dwoma ostatnimi przykładami, ponieważ nie do końca wiem jak powinny funkcjonować.

class Car:
    """
    Obiekt Car opisuje nam wlasnosci aut.
   
    :param str typ: typ auta
    :param str rodzaj: trzyma marke auta
    :param str model: trzyma model auta
    :param num pojemnosc: trzyma pojemnosc auta
 
    :Example:
 
    >>> Lambo = Car('SportCar', 'Lamborgini', 'Aventador', 4000)
    """
   
    def __init__(self, typ, marka, model, pojemnosc):
        self.typ = typ
        self.marka = marka
        self.model = model
        self.pojemnosc = pojemnosc
   
    def __str__(self):
        ret = f"{self.typ} marki {self.marka}, model {self.model}"
        ret += f" o pojemności {self.pojemnosc} dm^3"
        return ret
   
    #gettery
    def get_typ(self):
        return self.rodzaj
   
    def get_marka(self):
        return self.waga
   
    def get_model(self):
        return self.smak
   
    def get_pojemnosc(self):
        return self.pojemnosc
    #-------------------------
    #settery
    def set_typ(self, x):
        if isinstance(x, str):
            self.typ = x
        else:
            raise TypeError("Zmienna typ powinna byc lancuchem znakow STR")
           
    def set_marka(self, x):
        if isinstance(x, (int, float)):
            self.marka = x
        else:
            raise TypeError("Zmienna marka powinna byc lancuchem znakow STR")
   
    def set_model(self, x):
        if isinstance(x, str):
            self.model = x
        else:
            raise TypeError("Zmienna model powinna byc lancuchem znakow STR")
   
    def set_pojemnosc(self, x):
        if isinstance(x, str):
            self.pojemnosc = x
        else:
            raise TypeError("Pojemnosc powinna byc liczba INT lub FLOAT")
    #-------------------------
   
class ExclusiveCar(Car):
    """
    Obiekt Car opisuje nam wlasnosci aut.
   
    :param str typ: typ auta
    :param str rodzaj: trzyma marke auta
    :param str model: trzyma model auta
    :param num pojemnosc: trzyma pojemnosc auta
 
    :Example:
 
    >>> Lambo = Car('SportCar', 'Lamborgini', 'Aventador', 4000)
    """
   
    def __init__(self, marka, model, pojemnosc, nawigacja, komp):
        super().__init__("Exclusive Car", marka, model, pojemnosc)
        self.nawigacja = nawigacja
        self.komp = komp
   
    def __str__(self):
        return super().__str__() + f"\nAuto posiada nawigacje: {self.nawigacja}, Auto posiada komputer: {self.komp}"
   
    #gettery
    def get_typ(self):
        return self.rodzaj
   
    def get_marka(self):
        return self.waga
   
    def get_model(self):
        return self.smak
   
    def get_pojemnosc(self):
        return self.pojemnosc
   
    def get_nawigacja(self):
        return self.nawigacja
   
    def get_komp(self):
        return self.komp
    #-------------------------
    #settery
    def set_typ(self, x):
        if isinstance(x, str):
            self.typ = x
        else:
            raise TypeError("Zmienna typ powinna byc lancuchem znakow STR")
           
    def set_marka(self, x):
        if isinstance(x, (int, float)):
            self.marka = x
        else:
            raise TypeError("Zmienna marka powinna byc lancuchem znakow STR")
   
    def set_model(self, x):
        if isinstance(x, str):
            self.model = x
        else:
            raise TypeError("Zmienna model powinna byc lancuchem znakow STR")
   
    def set_pojemnosc(self, x):
        if isinstance(x, str):
            self.pojemnosc = x
        else:
            raise TypeError("Pojemnosc powinna byc liczba INT lub FLOAT")
    def set_nawigacja(self, x):
        if isinstance(x, str):
            self.nawigacja = x
        else:
            raise TypeError("Zmienna nawigacja powinna byc lancuchem znakow STR")
   
    def set_komp(self, x):
        if isinstance(x, str):
            self.komp = x
        else:
            raise TypeError("Zmienna komp powinna byc lancuchem znakow STR")
    #-------------------------
class SportCar(Car):
    """
    Obiekt Car opisuje nam wlasnosci aut.
   
    :param str typ: typ auta
    :param str rodzaj: trzyma marke auta
    :param str model: trzyma model auta
    :param num pojemnosc: trzyma pojemnosc auta
 
    :Example:
 
    >>> Lambo = Car('SportCar', 'Lamborgini', 'Aventador', 4000)
    """
   
    def __init__(self, marka, model, pojemnosc, sport, manetki):
        super().__init__("Exclusive Car", marka, model, pojemnosc)
        self.sport = sport
        self.manetki = manetki
   
    def __str__(self):
        return super().__str__() + f"\nAuto posiada tryb sport: {self.sport}, Auto posiada manetki: {self.manetki}"
       
    #gettery
    def get_typ(self):
        return self.rodzaj
   
    def get_marka(self):
        return self.waga
   
    def get_model(self):
        return self.smak
   
    def get_pojemnosc(self):
        return self.pojemnosc
   
    def get_sport(self):
        return self.sport
   
    def get_manetki(self):
        return self.manetki
    #-------------------------
    #settery
    def set_typ(self, x):
        if isinstance(x, str):
            self.typ = x
        else:
            raise TypeError("Zmienna typ powinna byc lancuchem znakow STR")
           
    def set_marka(self, x):
        if isinstance(x, (int, float)):
            self.marka = x
        else:
            raise TypeError("Zmienna marka powinna byc lancuchem znakow STR")
   
    def set_model(self, x):
        if isinstance(x, str):
            self.model = x
        else:
            raise TypeError("Zmienna model powinna byc lancuchem znakow STR")
   
    def set_pojemnosc(self, x):
        if isinstance(x, str):
            self.pojemnosc = x
        else:
            raise TypeError("Pojemnosc powinna byc liczba INT lub FLOAT")
    def set_sport(self, x):
        if isinstance(x, str):
            self.sport = x
        else:
            raise TypeError("Zmienna sport powinna byc lancuchem znakow STR")
   
    def set_manetki(self, x):
        if isinstance(x, str):
            self.manetki = x
        else:
            raise TypeError("Zmienna manetki powinna byc lancuchem znakow STR")
    #-------------------------
class OffRoadCar(Car):
    """
    Obiekt Car opisuje nam wlasnosci aut.
   
    :param str typ: typ auta
    :param str rodzaj: trzyma marke auta
    :param str model: trzyma model auta
    :param num pojemnosc: trzyma pojemnosc auta
 
    :Example:
 
    >>> Lambo = Car('SportCar', 'Lamborgini', 'Aventador', 4000)
    """
   
    def __init__(self, marka, model, pojemnosc, reg_wys, fxf):
        super().__init__("Exclusive Car", marka, model, pojemnosc)
        self.reg_wys = reg_wys
        self.fxf = fxf
   
    def __str__(self):
        return super().__str__() + f"\nAuto posiada regulację wysokości: {self.reg_wys}, Auto posiada napęd 4x4: {self.fxf}"
   
    #gettery
    def get_typ(self):
        return self.rodzaj
   
    def get_marka(self):
        return self.waga
   
    def get_model(self):
        return self.smak
   
    def get_pojemnosc(self):
        return self.pojemnosc
   
    def get_reg_wys(self):
        return self.reg_wys
   
    def get_fxf(self):
        return self.fxf
    #-------------------------
    #settery
    def set_typ(self, x):
        if isinstance(x, str):
            self.typ = x
        else:
            raise TypeError("Zmienna typ powinna byc lancuchem znakow STR")
           
    def set_marka(self, x):
        if isinstance(x, (int, float)):
            self.marka = x
        else:
            raise TypeError("Zmienna marka powinna byc lancuchem znakow STR")
   
    def set_model(self, x):
        if isinstance(x, str):
            self.model = x
        else:
            raise TypeError("Zmienna model powinna byc lancuchem znakow STR")
   
    def set_pojemnosc(self, x):
        if isinstance(x, str):
            self.pojemnosc = x
        else:
            raise TypeError("Pojemnosc powinna byc liczba INT lub FLOAT")
    def set_reg_wys(self, x):
        if isinstance(x, str):
            self.reg_wys = x
        else:
            raise TypeError("Zmienna reg_wys powinna byc lancuchem znakow STR")
   
    def set_fxf(self, x):
        if isinstance(x, str):
            self.fxf = x
        else:
            raise TypeError("Zmienna fxf powinna byc lancuchem znakow STR")
    #-------------------------
 
class ExclusiveSportCar(SportCar, ExclusiveCar):
    def __init__(self, marka, model, pojemnosc, sport, manetki):
        super().__init__(marka, model, pojemnosc, sport, manetki)
0

Strasznie dużo kopiuj-wklej. Wytnij nadmiar kodu z klas potomnych.
Co do pytania:

Łukasz Kiedos napisał(a):
class ExclusiveSportCar(SportCar, ExclusiveCar):
    def __init__(self, marka, model, pojemnosc, sport, manetki):
        super().__init__(marka, model, pojemnosc, sport, manetki)

to konstruktor powinien wyglądać bardziej jak:

class ExclusiveSportCar(SportCar, ExclusiveCar):
    def __init__(self, marka, model, pojemnosc, sport, manetki, nawigacja, komp):
        SportCar.__init__(marka, model, pojemnosc, sport, manetki)
        ExclusiveCar.__init__(marka, model, pojemnosc, nawigacja, komp)
0

Multiple inheritance to dość zaawansowany temat. Tutaj kilka sposobów na rozwiązanie Twojego problemu: https://stackoverflow.com/a/50465583

Druga sprawa to te gettery/settery... Zdaję sobie sprawę ze to tylko zadanie do nauki Pythona, ale z takimi wymaganiami może zrobić więcej szkody niż pożytku. W Pythonie zdecydowana wiekszość funkcjonalności setterow/getterow jest spełniona przez proste przypisanie i odczytywanie atrybutów obiektów (foo.bar = "baz"). Jeżeli jedyna walidacja którą settery wykonują to typ przekazywanych danych, lepiej jest użyć typów mypy i odwoływac sie bezpośrednio do atrybutów obiektu. W ten sposób mypy wyłapie przypisanie błędnego typu z ominięciem settera.

Do tego część kodu jest błędna:

  • Marka jako liczba
    def set_marka(self, x):
        if isinstance(x, (int, float)):
            self.marka = x
        else:
            raise TypeError("Zmienna marka powinna byc lancuchem znakow STR")
  • Pojemność jako string:
    def set_pojemnosc(self, x):
        if isinstance(x, str):
            self.pojemnosc = x
        else:
            raise TypeError("Pojemnosc powinna byc liczba INT lub FLOAT")
0

Kiedy dostajesz zadanie z javy i każą robić je w pythonie
gettery, settery xD

1 użytkowników online, w tym zalogowanych: 0, gości: 1