Chcę zamówić metody w klasie Pythona, ale nie wiem, jaka jest właściwa kolejność.
Kiedy wyodrębniam metody w Eclipse za pomocą PyDev, Eclipse umieszcza wyodrębnioną metodę na wierzchu zmodyfikowanej metody. Ale to stawia szczegóły niższego poziomu przed szczegółami wyższego poziomu. Według wujka Boba powinienem zrobić coś odwrotnego, żeby mój kod brzmiał jak nagłówki gazety. Kiedy programuję Javę, po prostu postępuję zgodnie z jego radą.
Jaka jest najlepsza praktyka w Pythonie?
Odpowiedzi:
Jak zauważyli inni, nie ma właściwego sposobu na zamówienie swoich metod. Może sugestia PEP byłaby przydatna, ale tak czy inaczej. Spróbuję podejść do twojego pytania tak obiektywnie, jak to tylko możliwe.
Najpierw interfejsy: metody publiczne i magiczne funkcje Pythona definiują interfejs klasy. W większości przypadków Ty i inni programiści chcecie używać klasy, zamiast ją zmieniać. Dlatego będą zainteresowani interfejsem tej klasy. Umieszczenie go na pierwszym miejscu w kodzie źródłowym pozwala uniknąć przewijania szczegółów implementacji, które Cię nie interesują.
Właściwości, metody magiczne, metody publiczne: Trudno jest zdefiniować najlepszą kolejność między tymi trzema, które są częścią interfejsu klasy. Jak mówi @EthanFurman, najważniejsze jest, aby trzymać się jednego systemu dla całego projektu. Ogólnie rzecz biorąc, ludzie oczekują
__init__()
najlepszej pierwszej funkcji w klasie, więc poniżej przedstawiam inne magiczne metody.Kolejność czytania: Zasadniczo istnieją dwa sposoby opowiadania historii: oddolne lub odgórne. Umieszczając na pierwszym miejscu funkcje wysokopoziomowe, programista może z grubsza zrozumieć klasę, czytając kilka pierwszych wierszy. W przeciwnym razie należałoby przeczytać całą klasę, aby uzyskać jakiekolwiek zrozumienie klasy, a większość programistów nie ma na to czasu. Z zasady stawiaj metody ponad wszystkie metody wywoływane z ich ciała.
Metody klasowe i metody statyczne: Zwykle wynika to z kolejności czytania wyjaśnionej powyżej. Normalne metody mogą wywoływać wszystkie metody razy i dlatego są pierwsze. Metody klasowe mogą wywoływać tylko metody klasowe i metody statyczne i są następne. Metody statyczne nie mogą wywoływać innych metod tej klasy i zajmować ostatniego miejsca.
Mam nadzieję że to pomoże. Większość z tych reguł nie jest specyficzna dla Pythona. Nie znam języka, który wymusza kolejność metod, ale jeśli tak, byłoby to dość interesujące i proszę o komentarz.
źródło
__init__
jawnie (w połączeniu z__new__
) lub niejawnie (za pośrednictwem domyślnego konstruktora), więc byłby to powód do umieszczenia ich razem z__init__
. (Chociaż nigdy nie widziałem ich umieszczony przed__init__
.)Nie ma jednej prawidłowej kolejności. Wybierz system i trzymaj się go. Ten, którego używam, to:
class SomeClass(object): def __magic_methods__(self): "magic methods first, usually in alphabetical order" def _private_method(self): "worker methods next, also in alpha order" def a_method(self): "then normal methods, also in alpha order"
źródło
@staticmethod
,@classmethod
,@property
oraz wszelkie inne@decorator
linie więc używam rodzaj metody, aby określić, gdzie to idzie (z wyjątkiem tego, że właściwości mają tendencję, aby przejść między_private_methods
anormal_methods
).@classmethod
s come next (@classmethod def a_class_method(cls)
), a następnie@staticmethod
s (@staticmethod def a_static_method()
)? Przynajmniej taka jest polityka, jaką rozumiem ... (bez mojego IDE składającego cokolwiek, ponieważ mi się to nie podoba)Robię coś podobnego do @Ethan, które widziałem w kodzie źródłowym Django, gdzie główna różnica jest duża "############" blok komentarzy, aby rozgraniczać obszary. Na przykład,
class SomeClass(object): ################# # Magic Methods # ################# def __magic_methods__(self): "magic methods first" ################## # Public Methods # ################## def a_method(self): "then normal methods, in order of importance" ################### # Private Methods # ################### def _private_method(self): "then worker methods, grouped by importance or related function"
Oczywiście jest to mniej przydatne dla mniejszych klas.
źródło
####
bloki, kiedy zdałem sobie sprawę, że umieściłeś je tam celowo! Zgadzam się jednak z zamówieniem , o co chodzi w tym pytaniu. Zalecałbym usunięcie####
z tego przykładu, ponieważ nie dotyczy to zakresu pytania, a Twój przykład należy do małej klasy, której i tak byś nie używał####
. :-)