Piszę mały moduł Pythona składający się z dwóch części:
- niektóre funkcje definiujące interfejs publiczny,
- klasa implementacji używana przez powyższe funkcje, ale która nie ma znaczenia poza modułem.
Na początku zdecydowałem się „ukryć” tę klasę implementacji, definiując ją wewnątrz funkcji, która jej używa, ale to utrudnia czytelność i nie może być używane, jeśli wiele funkcji ponownie używa tej samej klasy.
Czy zatem oprócz komentarzy i ciągów dokumentów istnieje mechanizm oznaczania klasy jako „prywatnej” lub „wewnętrznej”? Zdaję sobie sprawę z mechanizmu podkreślenia, ale jak rozumiem dotyczy to tylko zmiennych, nazw funkcji i metod.
python
access-modifiers
oparisy
źródło
źródło
W skrócie:
Nie możesz wymusić prywatności . W Pythonie nie ma prywatnych klas / metod / funkcji. Przynajmniej nie ścisłej prywatności, jak w innych językach, takich jak Java.
Możesz tylko wskazać / zasugerować prywatność . To jest zgodne z konwencją. Konwencja Pythona dotycząca oznaczania klasy / funkcji / metody jako prywatnej polega na poprzedzeniu jej znakiem _ (podkreślenie). Na przykład
def _myfunc()
lubclass _MyClass:
. Możesz również utworzyć pseudo-prywatność, poprzedzając metodę dwoma podkreśleniami (np__foo
. :) . Nie możesz uzyskać bezpośredniego dostępu do metody, ale nadal możesz ją wywołać za pomocą specjalnego prefiksu przy użyciu nazwy klasy (np_classname__foo
. :) . Więc najlepsze, co możesz zrobić, to wskazać / zasugerować prywatność, a nie ją egzekwować.Pod tym względem Python jest podobny do perla. Parafrazując słynne zdanie o prywatności z książki Perla, filozofia jest taka, że powinieneś trzymać się z dala od salonu, ponieważ nie zostałeś zaproszony, a nie dlatego, że jest broniony strzelbą.
Po więcej informacji:
źródło
Zdefiniuj
__all__
listę nazw, które chcesz wyeksportować ( zobacz dokumentację ).źródło
Wzór, którego czasami używam, to:
Zdefiniuj klasę:
Utwórz instancję klasy, nadpisując nazwę klasy:
Zdefiniuj symbole ujawniające funkcjonalność:
Usuń samą instancję:
Teraz masz moduł, który ujawnia tylko twoje funkcje publiczne.
źródło
Konwencja polega na dodawaniu „_” do wewnętrznych klas, funkcji i zmiennych.
źródło
Aby rozwiązać kwestię konwencji projektowych, i jak powiedział Christopher, w Pythonie nie ma czegoś takiego jak „prywatny”. Może się to wydawać dziwne dla kogoś, kto pochodzi z C / C ++ (tak jak ja jakiś czas temu), ale w końcu prawdopodobnie zdasz sobie sprawę, że przestrzeganie konwencji wystarczy.
Widzenie czegoś z podkreśleniem z przodu powinno być wystarczająco dobrą wskazówką, aby nie używać tego bezpośrednio. Jeśli obawiasz się zaśmiecania
help(MyClass)
danych wyjściowych (na co wszyscy patrzą, szukając sposobu użycia klasy), podkreślone atrybuty / klasy nie są tam zawarte, więc w końcu zostanie opisany interfejs „publiczny”.Dodatkowo, posiadanie wszystkiego, co publiczne, ma swoje własne niesamowite korzyści, na przykład, możesz testować jednostkowo prawie wszystko z zewnątrz (czego nie możesz zrobić z prywatnymi konstrukcjami C / C ++).
źródło
Użyj dwóch podkreślników, aby poprzedzić nazwy „prywatnych” identyfikatorów. W przypadku klas w module użyj pojedynczego początkowego podkreślenia, a nie zostaną zaimportowane przy użyciu opcji „from module import *”.
(W Pythonie nie ma czegoś takiego jak prawdziwe „prywatne”. Na przykład Python po prostu automatycznie zmienia nazwy członków klasy z podwójnymi podkreśleniami na
__clssname_mymember
. Tak naprawdę, jeśli znasz zniekształconą nazwę, i tak możesz użyć jednostki „prywatnej” . Zobacz tutaj. Oczywiście, jeśli chcesz, możesz ręcznie importować klasy „wewnętrzne”).źródło