#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ę
@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').
@GlenPL: ciekawie to brzmi z tym **kwargs, ale nie wiem jak to zaimplementować, a chciałbym zeby kod był w miarę uniwersalny i przejrzysty . to *args, **kwargs ma być tylko w initach w klasach dziedziczacych, czy w głownej też ?
@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ć :))
@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ł :
@JungleJamPL: do dzieła, poczytaj sobie w dokumentacji albo w odpowiedziach na stacku o tym o czym wspomniałem i próbuj napisać, w taki sposób się najlepiej nauczysz jak to działa :) Jak będziesz miał problem to zawsze możesz wołać
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
tam gdzie pobierasz
int(input(
to ta linijka też powinna być wtry
dziedziczenie:
każdy
__init__(self, dodatkowy_atrybut, dodatkowy_atr2, *args, **kwargs)
w klasach dziedziczących ma mieć w pierwszej linijcesuper().__init__(*args, **kwargs)
. Używaj keyword argumentów, a nawet keyword-only argumentów.@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').
pastebin: https://pastebin.com/DSmh8jKm
@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
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ł :