2013-02-24 13 views
5

Chciałbym ustawić hierarchię klas w Pythonie 3.2 z dostępem "chronionym": Członkowie klasy bazowej będą w zakresie tylko dla klas pochodnych, ale nie "publicznie".Dostęp "chroniony" w Pythonie - jak?

Podwójny podkreślnik powoduje, że członek jest "prywatny", jedno podkreślenie oznacza ostrzeżenie, ale członek pozostaje "publiczny". Co (jeśli jakiekolwiek ...) jest poprawną składnią do oznaczenia "chronionego" członka.

+6

Nie można zrobić. Użyj konwencji '_single_underscore' i bądź szczęśliwy. – JBernardo

Odpowiedz

8

Zasiłek dla członków w Pythonie działa według "negocjacji" i "traktatów", nie na siłę.

Innymi słowy, użytkownik twojej klasy powinien odstąpić od rzeczy, które nie są ich sprawą, ale nie możesz wymusić tego, że inne niż moje, używając identyfikatorów _xxx, jasno stwierdzą, że ich dostęp (zwykle) nie jest odpowiedni .

+0

Więc to nie jest możliwe. OK. Ale mam problem z "traktatami", a nie z "siłą", którą wielokrotnie wyrażałem: idea, która kryje się za specyfikacjami dostępu, nie polega tak naprawdę na tym, aby inni ludzie nie robili czegoś złego. Chodzi o przejrzystą, uporządkowaną organizację Twojego kodu. Chcę, aby mój język POMÓŻ MI ZROBIĆ, nie zostawiajcie otwarć na wszelkiego rodzaju zwariowane hacki, które są powszechne w kodzie Pythona, który często widzę. (Wskazując, że prawdopodobnie nie powinienem używać Pythona ...) – Vector

3

Podwójne podkreślenia nie powodują, że członek jest "prywatny" w sensie C++ lub Java - Python dość wyraźnie unika tego rodzaju wymuszanych przez język reguł dostępu. Podsumowując, pojedyncza podkreśla atrybut lub metodę jako "szczegół implementacji" - to znaczy, że rzeczy na zewnątrz wciąż mogą się do niego dostać, ale nie jest to obsługiwana część interfejsu klasy, a zatem gwarancje, które klasa może zrobić o niezmiennikach lub kompatybilności wstecz/do przodu, przestają obowiązywać. To rozwiązuje ten sam problem koncepcyjny, co "prywatny" (oddzielenie interfejsu i implementacji) w inny sposób.

dwukrotnie podkreśla powołać nazwa przekręcona który nadal nie jest „prywatny” - to tylko nieco mocniejsze sformułowanie powyższego, przy czym: - Funkcja ta jest szczegółowo wdrożenie tej klasy ale - podklasy może zasadnie oczekiwać, aby mieć metodę o tej samej nazwie, które nie jest pomyślany jako zastąpiona wersja oryginalnego

to wymaga trochę wsparcia językowego, przy czym __name jest zniekształcone zawierać nazwę klasy - więc wersje podklasy tego programu otrzymują inne nazwy zamiast przesłonić. Jest jeszcze całkiem możliwe, że podklasa lub kod zewnętrzny wywoła tę metodę, jeśli naprawdę tego chce - a celem wymieszania nazw jest jawnie , a nie, aby temu zapobiec.

Ale to wszystko dlatego, „chronione” okazuje się nie do sensu w Pythonie - jeśli naprawdę mieć metodę, która mogłaby przebić niezmienników chyba nazywany przez podklasy (i realistycznie, prawdopodobnie don Nawet jeśli myślisz, że to robisz), Python Way ma to udokumentować. Umieść notatkę w swoim docstringu do skutku "Zakłada się, że jest ona wywoływana tylko przez podklasy" i uruchamia się z założeniem, że klienci zrobią to, co trzeba - ponieważ jeśli tego nie zrobią, stanie się to ich własnym problemem.

+0

"Podwójne podkreślenia nie powodują, że członek jest" prywatny "w sensie C++ lub Java ..." - zrozumiał. Właśnie dlatego powiedział "prywatny" w cudzysłowie. Ale dzięki za odświeżenie. – Vector

Powiązane problemy