Jeśli „jawne jest lepsze niż niejawne”, dlaczego nie ma w Pythonie jawnych modyfikatorów dostępu: publicznego, chronionego, prywatnego itp.?
Wiem, że chodzi o to, że programista powinien wiedzieć, co robić za pomocą podpowiedzi - nie trzeba używać „brutalnej siły”. Ale „enkapsulacja” lub „ukrywanie informacji” IMO to nie tylko po to, by ludzie byli z dala, to kwestia organizacji i struktury: twoje warstwy programistyczne powinny mieć samookreślające się, wyraźnie określone zakresy i granice, tak jak robią to systemy fizyczne.
Czy ktoś może mi pomóc tutaj z dokładnym wyjaśnieniem, dlaczego ograniczenia dostępu są sugerowane, a nie jawne w Pythonie, języku, który w przeciwnym razie wydaje się być idealny?
Edycja: Do tej pory widziałem 3 proponowane odpowiedzi i zdałem sobie sprawę, że moje pytanie składa się z 2 części:
Dlaczego na przykład nie ma słów kluczowych
private def myFunc(): dostuff....
zamiast IMO brzydkie i trudne do wpisania podkreślenia. Ale to nie jest ważny punkt.
Co ważniejsze:
Dlaczego te modyfikatory dostępu są tylko „zaleceniami” lub wskazówkami i nie są egzekwowane. Trudno będzie później to zmienić? Bardzo łatwo jest zmienić „chroniony” na „publiczny” - a jeśli masz skomplikowany łańcuch dziedziczenia, który utrudnia, masz kiepski projekt - twój projekt powinien być udoskonalony, a nie polegać na funkcji językowej, która ułatwia pisanie źle skonstruowany kod.
Po wprowadzeniu modyfikatorów dostępu kod jest automatycznie dzielony na przedziały - WIESZ, że niektóre segmenty są poza zakresem, więc nie musisz sobie z nimi radzić, chyba że i kiedy jest to konieczne. A jeśli twój projekt nie jest dobry, a ty ciągle przemieszczasz rzeczy do różnych zakresów, język może pomóc ci posprzątać.
Mimo że uwielbiam Python, uważam, że ten drugi punkt jest poważnym brakiem. I nie znalazłem jeszcze na to dobrej odpowiedzi.
źródło
private def whatever
polega na tym, żeclass x: def whatever(self): pass
jest to skrót doclass x: pass; x.whatever = lambda self: pass
, więc w zasadzie potrzebujesz prywatnego modyfikatora do przypisaniaOdpowiedzi:
„Jawne jest lepsze niż niejawne” to tylko jedna z maksym filozofii projektowania Pythona. Jest też „proste jest lepsze niż złożone”. I chociaż nie ma go w Zen Pythona, „Wszyscy zgadzamy się tutaj, dorośli” to coś innego.
Ta druga zasada jest chyba najważniejsza. Kiedy projektuję klasę, mam pojęcie, w jaki sposób będzie ona wykorzystywana. Ale nie mogę przewidzieć wszystkich możliwych zastosowań. To może być to, że niektóre przyszłe wykorzystanie mojego kodu wymaga dostępu do zmiennych Myślałam jako prywatne. Dlaczego miałbym utrudniać, a nawet uniemożliwiać dostęp do nich, jeśli przyszły programista (a nawet przyszły ja) potrzebuje ich? Najlepszym rozwiązaniem jest oznaczenie ich ostrzeżeniem - jak zauważa Joonas, standardowy prefiks podkreślenia jest standardem - że są wewnętrzne i mogą ulec zmianie; ale całkowity zakaz dostępu wydaje się niepotrzebny.
źródło
Podejrzewam, że głównym powodem braku modyfikatorów dostępu jest prostota
Jak mówisz, nie chodzi o trzymanie ludzi z dala, chodzi o organizację, więc głównym punktem „prywatnego” jest to, że wysyła wiadomość do użytkowników twojego interfejsu API „nie pisz kodu, który zależy od tego”.
Trywialne jest stwierdzenie „zgodnie z konwencją, _x lub __x nie powinny być używane poza klasą”, ale w dynamicznym modelu obiektowym Pythona trudno byłoby nawet wymyślić notację.
jak zauważyć dostępność?
To chyba kompromis. Jeśli ściśle nie możesz z tym żyć, sugerowałbym rubin, który ma podobny poziom abstrakcji i dynamiki, ale ma model obiektowy, który pozwala na modyfikację dostępu.
źródło
__x__
to „magia” (tj. metody wywoływane w celu umożliwienia integracji językowej, takie jak przeciążenie operatora, iterowalność itp.). Konwencja jest_x
.__init__
było przypadkowe. Przykład ustawia niektóre właściwości obiektu, które nie są znane w czasie kompilacji, więc wyraźny modyfikator dostępu nie pomoże.Konwencja Pythona polega na użyciu prefiksu podkreślenia dla członków chronionych / prywatnych.
Konwencja ta, kiedy następuje, jest faktycznie taki sam jak modyfikatory dostępu, z wyjątkiem: 1) zobaczysz bezpośrednio od uczestnika nazwy czy to publicznych, czy nie, i 2), które mogą złamać „hermetyzacji”, jeśli naprawdę chcesz (może to być uzasadnione np. podczas testowania; w niektórych innych językach będziesz musiał użyć refleksji == więcej kodu).
Ostatecznie jest to kwestia gustu, ale jeśli możesz zrobić to samo (z nieco większą elastycznością) bez specjalnych słów kluczowych, język będzie mniejszy, a kod będzie bardziej zwięzły, co na ogół jest dobrą rzeczą.
źródło