Wpis z mikrobloga

Mirki, trochę mnie boli w Pythonie, że można robić "brzydkie rzeczy", więc nietrudno nabrać złych przyzwyczajeń bez nauczyciela/współpracownika.

Teraz rozkminiam __init__() - przykład z tę samą klasą zaimplementowaną na 2 sposoby: https://pastebin.com/qG1aJ9SU
Klasa Napraw to "typowa konstrukcja", gdzie wszystko mam w __init__, ale wymusza podawanie parametrów przy tworzeniu instancji.
Klasa Tagi - nie wiem jak często albo czy w ogóle taka konstrukcja jest używana, ale w mojej ocenie jest wygodniejsza w użyciu i bardziej wszechstronna.
- można sobie instancję A) stworzyć bez parametrów: Tagi() i potem je zmodyfikować wywołując obj.setup(...), albo B) stworzyć od razu z parametrami: Tagi.with_args(1, 2).
- parametry obiektu można sobie zmodyfikować w dowolnym momencie metodą self.setup() i jest to logiczne, skoro metoda jest zaprojektowana do wykorzystania przy inicjalizacji obiektu.
- dziedziczenie po takiej klasie wydaje się łatwiejsze, szczególnie w przypadku dziedziczenia po wielu klasach jednocześnie, gdzie w przypadku Napraw() potrzebna byłaby jakaś dziwna żonglerka parametrami, a tu można sobie dać super().__init__(*args, **kwargs) i przekazywać dalej parametry wymagane przez inne klasy.

No ale może się nie zgadzacie i jednak lepiej wszystko wrzucać w __init__() ?

#python #programowanie #oop
  • 9
rozwiązuje problem, którego nie ma


@Saly: Nie do końca nie ma. Czasami trzeba dziedziczyć po klasach z innych modułów i wtedy jest wspomniany problem z super().__init__() i przekazywaniem odpowiednich parametrów.
@MakuZo: No tak, tylko, że łatwiej implementuje się dziedziczenie inicjalizatora, który nie zakłada jakichś konkretnych parametrów pozycyjnych :P A odnośnie object to Python 3 i tak się po nim dziedziczy, tylko nie trzeba wpisywać, nie wiem, czy to miałeś na
Przecież przy inicjalizacji też można użyć parametrów domyślnych (keyword arg),


@MakuZo: A jeżeli chodzi o inicjalizację samego obiektu używając **kwargs, już pomijając przekazywanie klasom dziedziczonym, to chyba niezbyt dobry pomysł, żeby inicjalizować obiekt z niesprecyzowanymi atrybutami?
Brudne rzeczy? TO jak w HTML, tu dasz spację, tam nie, tu dasz ", tam nie, w sumie to nawet nie musisz stosować zamykających tagów, ciężko się wtedy przerzucić na język bardziej restrykcyjny.
@grajlord ta druga klasa to jakiś szatan, dostajesz acziwmenta za #!$%@? kod. Idealny przykład brzydkiej rzeczy.

Nie rozumiem za bardzo problemu. Użyj jak człowiek argsow kwargsów albo domyślnych wartosci, jak chcesz mieć opcjonalne argumenty.

A żeby zmienić parametry w dowolnym momencie, to nie wiem, może instancja.parametr = nowa_wartość?

Z dziedziczeniem nie ma żadnych problemów, wymyślasz sobie.
@grajlord: Po prostu dajesz domyślną wartość None i jeżeli potrzebujesz, to sprawdzasz czy jakiś argument został podany np if m: self.m = m, choć to i tak niepotrzebnie zagmatwane. Tak jak wyżej napisali, tworzysz problem tam gdzie go nie ma ;) Co do dziedziczenia object to tak, w Pythonie3 każdy obiekt po nim dziedziczy. Przydaje się to w przypadku gdy chcemy kompatybilności z Pythonem2, bo tam już trzeba dziedziczyć object żeby
Zdefiniowales atrybuty klasy, nie obiektu. Stworz kilka instancji tym sposobem i sprawdz wartosc tych atrybutow...


@m_bielawski: Atrybuty klasy są w definicji klasy i nigdzie indziej ich nie modyfikuję. Jeżeli chodzi ci o metodę cls.with_args(), to w niej modyfikuję obiekt, a nie klasę, więc atrybuty klasy pozostają niezmienione - ciągle None.