Wpis z mikrobloga

mam metodę abstrakcyjną "jedzzupe":

class Parent():

@abstractmethod
def jedz
zupe( ):
pass

class Child1(Parent)

def jedzzupe( Parent) :
# jem zupe pomidorowa

class Child2()
def jedz
zupe():
# jem zupe ogorkowa

chciałbym teraz zeby wewnątrz metody "jedzzupe" wykonał się jeden wspólny krok np. "zamieszaj"
niestety metoda jedz
zupe jest w kilku miejscach i musialbym po prostu robić copy-paste zeby dodać ten jeden krok więcej.
Najlepiej jakby ten wspólny krok "zamieszaj" dało się wrzucić do abstrakcyjnej metody i wtedy z automatu reszta by odziedziczyla "zamieszaj" + dodali swoją wersję jedzenia zupy.

Jak to poukładać?

#python #programowanie
  • 12
@FantaZy: Można trochę inaczej to rozłożyć i skupić się na implementacji interfejsu, co będzie bardziej elastyczne niż dziedziczenie. Poniżej luźne funkcje, nie dorzucałbym ich do Parent

def zamieszaj():
# ta wspólna logika

def jedzzupe(obj: Parent):
zamieszaj(obj)
obj.jedz
zupe()

Tym sposobem masz ładną funcję do używania wszędzie w kodzie, możesz zaimplementować interfejs jak trzeba, a wspólny krok "zamieszaj" się wykona bez robienia super() w każdej implementacji "jedz_zupe".

Btw, pisz kod po
konto usunięte via Wykop Mobilny (Android)
  • 2
@FantaZy: tak klasycznie to pasowałoby dodać to do metody abstrakcyjnej i wywołać ja w każdej override'owanej w pierwszej linijce - w Pythonie to się robi chyba przez Parent.jedz_zupe() lub super().jedz_zupe()

Dekorator też brzmi bardzo fajnie, ale wciąż trzeba wszędzie to podawać

Ja to bym sobie stworzy executora w stylu "mieszaj i jedz zupę", do niego przekazywał obiekt pochodny po Parent i tam zaimplementował mieszanie + wywołanie jedz_zupe - dzięki temu wspólna
konto usunięte via Wykop Mobilny (Android)
  • 0
a da się tak, że w klasie abstrakcyjnej będzie trochę implementacji? ( ͡° ͜ʖ ͡°)

@FantaZy: jeszcze jedno mi przyszło do głowy - zrobić funkcje w Parent jedzzupe, która miesza w pierwszej linijce a w drugiej wola metodę terazjedz_zupe która kolejne klasy nadpisują - ale tak z punktu widzenia czystego kodu to kiepskie rozwiązanie xD ale może wystarczy
@powaznyczlowiek jesli 'zamieszaj' jest w klasie parent to potem u kazdego z Child robie
self.zamieszaj() i dziala.

dekorator musze dodac we wszystkich miejscach gdzie mam metode 'jedzzupe'.... tak samo jak w innym wypadku musze dodać wywołanie 'zamieszaj' ...

koniec koncow po prostu wszedzie wstawie ten sam kod z 'zamieszaj' i tyle.
projekt juz istniejący wiec wszystkie Childy i jedz
zupe juz są i ciężko cośz nimi zrobić.
konto usunięte via Wykop Mobilny (Android)
  • 0
@FantaZy: no dlatego ja bym dodał te linijkę tam gdzie jest wywoływane jedz_zupe - moje dwie pierwsze propozycje i to co chcesz zrobić też nie jest ok z punktu widzenia czystego kodu