Python - czy powinienem umieszczać funkcje pomocnicze wewnątrz czy poza klasą?

W Pythonie, jeśli niektóre metody klasy potrzebują funkcji helpera, ale sama funkcja helper nie używa niczego w klasie, czy powinienem umieścić funkcję helper wewnątrz lub na zewnątrz klasy?

Próbowałem umieścić go w środku, ale pylint narzekał, że ta funkcja mogła być umieszczona na zewnątrz.

@ Karl:

Klasa jest uaktualniaczem oprogramowania, a funkcja pomocnicza tworzy nowy folder, jeśli folder jeszcze nie istnieje. Klasa jest w module posiadającym prawie na razie tylko kod dla klasy. Inne klasy mogą być dodane później.

Author: SurvivalMachine, 2011-10-22

2 answers

Decydując, gdzie umieścić funkcje pomocnicze, zadaję sobie pytanie :" czy jest to tylko dla tej klasy?"Jeśli może pomóc w innych miejscach, to idzie na poziom modułu; jeśli rzeczywiście jest tylko dla tej klasy, to idzie do klasy z staticmethod (nie potrzebuje danych klasy do wykonania swojego zadania) lub classmethod (używa jakiejś klasy, ale nie instancji, danych do wykonania swojego zadania).

Kolejnym sprawdzaczem kodu Pythona jest pyflakes .

 47
Author: Ethan Furman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-21 22:07:55

Możliwe, że funkcja pomocnicza lepiej pasuje do poziomu modułu niż klasy.

Jeśli nie zgadzasz się, że tak jest, istnieje dekorator staticmethod , którego możesz użyć na funkcjach wewnątrz klasy. Mówiąc najprościej, statyczna metoda zachowuje się tak samo pomiędzy instancjami obiektów tej samej klasy. Nie opiera się na danych instancji.

Z tego powodu dekorator staticmethod renderuje zachowanie na funkcji tak, że nie przyjmuje implicit pierwszy argument (typowo self), Jak podano w dokumentacji).

 8
Author: Brian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-21 21:12:57