Wpis z mikrobloga

#python #naukaprogramowania #klasy mam takie dośc proste pythanie . mamy podstawową klasę pojazd która ma atrybuty nazwa i prędkość . oprócz tego chciałbym zrobić 3 klasy dziedziczące po klasie pojazd: osobowy/motor/dostawczy , które każda oddzielnie bedzie miała swoje własne atrybuty, o które automatycznie poprosi użytkownika podczas inicjalizowania. Założmy ze będzie to dla podanego przykładu:
osobowy : ilu drzwiowy
motor : jakie manetki
dostawczy: ile palet sie zmiesci

jak to najlepiej zainicjalizowac ? stworzyć dodatkowe inity dla każdej z klas dziedziczących ? czy w w kązdym z initów musi być super init ? oczywiście założenie jest żeby kod był w miare czytelny i potwarzać jak najmniej linijek kodu ?
ktoś spotkał się z podobnym przypadkiem ? dziękuję

paste bin : https://pastebin.com/nAq3jZKh
J.....L - #python #naukaprogramowania #klasy mam takie dośc proste pythanie . mamy po...

źródło: comment_BbEYV3qm0vUmRcqCZyzru5Np8UduU1Tj.jpg

Pobierz
  • 11
@JungleJamPL: zainstaluj sobie jakiś linter bo masz dużo błędów stylu;

tam gdzie pobierasz int(input( to ta linijka też powinna być w try
dziedziczenie:

każdy __init__(self, dodatkowy_atrybut, dodatkowy_atr2, *args, **kwargs) w klasach dziedziczących ma mieć w pierwszej linijce super().__init__(*args, **kwargs). Używaj keyword argumentów, a nawet keyword-only argumentów.
@kozubix: W wielu językach konstruktor klasy bazowej wywoływany jest automatycznie. W Pythonie wiele osób traktuje _init jako konstruktor i spodziewa się podobnego zachowania.
@JungleJamPL
init_ to specjalana metoda (inicjalizator). Jeśli chcesz zmienić jej zachowanie w klasie potomnej, musisz ją nadpisać (override). Jeśli chcesz zachować funkcjonalność rodzica, to po nadpisaniu w klasie potomnej musisz odwołać się do niej poprzez 'super' (i w Twoim przypadku przekazać 'nawa' i 'predkosc').
@kozubix: tak, python ma multiple inheritance

@JungleJamPL: *args i **kwargs to magiczny syntax znaczący: wszystkie przekazane wartości, których nie udało się przypisać do nazwanych parametrów funkcji, wrzuć kolejno albo do zmiennej args (pozycyjne, list) albo do kwargs (argumenty nazwane, dict)

żeby mieć możliwość przekazać je do super().__init__ musisz je zapisać jako argumenty tego inita (tutaj - linijkę nad wywołaniem supera, w sygnaturze init_ musisz je jawnie wymienić :))

teoretycznie
@GlenPL:
ogólnie moim założeniem było: robię obiekt klasy motor/osobowy/dostawczy .
klasy te dziedziczą po klasie pojazd.
pojazd inicializuje się 3 argumentami ( Nazwa, predkośc, typPaliwa) i dodatkowo w zaleznosci jaką klasę się wybrało:

jesli wybrało się np. motor to chciałbym, zeby program automatycznie dodatkowo zapytał : "Prosze podać rodzaj manetek" . i wtedy użytkownik wpisuje z klawiatury : podgrzewane

jeśli wybrało się dostawczy to chcialbym aby program automatycznie dodatkowo zapytał :