Według http://www.faqs.org/docs/diveintopython/fileinfo_private.html :
Podobnie jak większość języków, Python ma pojęcie elementów prywatnych:
- Funkcje prywatne, których nie można wywołać spoza modułu
Jeśli jednak zdefiniuję dwa pliki:
#a.py
__num=1
i:
#b.py
import a
print a.__num
po uruchomieniu b.py
drukuje się 1
bez żadnego wyjątku. Czy diveintopython jest zły, czy coś źle zrozumiałem? A czy jest jakiś sposób, aby nie definiować funkcje modułu jako prywatny?
>>> import fileinfo >>> m = fileinfo.MP3FileInfo() >>> m.__parse("/music/_singles/kairo.mp3") 1 Traceback (innermost last): File "<interactive input>", line 1, in ? AttributeError: 'MP3FileInfo' instance has no attribute '__parse'
fileinfo.MP3FileInfo () jest instancją klasy. Co daje ten wyjątek, gdy używasz podwójnego podkreślenia. Podczas gdy w twoim przypadku nie stworzyłeś klasy, po prostu stworzyłeś moduł. Zobacz także: stackoverflow.com/questions/70528/…Odpowiedzi:
W Pythonie „prywatność” zależy od poziomu „zgody dorosłych” - nie można tego narzucić (bardziej niż w prawdziwym życiu ;-). Jeden wiodący znak podkreślenia oznacza, że nie powinieneś uzyskiwać do niego dostępu „z zewnątrz” - dwa wiodące znaki podkreślenia (bez podkreślenia końcowego) przenoszą komunikat jeszcze mocniej ... ale ostatecznie zależy to od społeczności konwencja i konsensus: introspekcja Pythona jest na tyle silna, że nie możesz kajdanek każdego innego programisty na świecie, aby uszanować twoje życzenia.
((Btw, jeśli jest to ściśle utrzymywane w tajemnicy, tak samo odnosi się do C ++: z większością kompilatorów, prosta
#define private public
linia przed#include
ing swoje.h
! Plik jest potrzebny dla przebiegłych koderów zrobić skrót swojej „prywatności” ... -) )źródło
static void foo()
tak prywatny, jak to możliwe. Jest on przynajmniej ukryty dla linkera, a funkcję można całkowicie usunąć przez wstawienie.Pomiędzy szeregowymi szeregowymi a prywatnymi modułowymi może być zamieszanie .
A Moduł prywatne zaczyna się od jednego podkreślenia
taki element nie zostanie skopiowany razem podczas korzystania z
from <module_name> import *
formularza polecenia importu; jest jednak importowany, jeśli używa sięimport <moudule_name>
składni ( patrz odpowiedź Bena Wilhelma )Po prostu usuń jeden znak podkreślenia z a .__ przykładu pytania i nie będzie on wyświetlany w modułach, które importują a.py przy użyciu
from a import *
składni.A klasa prywatne rozpoczyna się dwoma podkreśleniami (aka Dunder czyli d-ouble pod-score)
Taka zmienna ma nazwę „zniekształcone” zawierać nazwę klasy itd.
To może nadal być dostępne poza logiką klasowej, poprzez zniekształconej nazwy.
Chociaż zmiana nazwy może służyć jako łagodne urządzenie zapobiegające nieautoryzowanemu dostępowi, jej głównym celem jest zapobieganie możliwym kolizjom nazw z członkami klas klas przodków. Zobacz zabawne, ale dokładne odniesienie Alexa Martellego do wyrażających zgodę dorosłych, gdy opisuje konwencję stosowaną w odniesieniu do tych zmiennych.
źródło
__private_function
? Wpadłem na to i popełniłem z tego powodu błędy.Na to pytanie nie udzielono pełnej odpowiedzi, ponieważ prywatność modułu nie jest czysto konwencjonalna, a ponieważ importowanie może, ale nie musi, rozpoznać prywatność modułu, w zależności od tego, w jaki sposób jest używany.
Jeśli zdefiniujesz prywatne nazwy w module, nazwy te zostaną zaimportowane do dowolnego skryptu korzystającego ze składni „import nazwa_modułu”. Tak więc, zakładając, że poprawnie zdefiniowałeś w swoim przykładzie moduł private, _num, w a.py, tak jak ...
.. będziesz mógł uzyskać do niego dostęp w b.py z symbolem nazwy modułu:
Aby zaimportować tylko nieprywatne z a.py, musisz użyć składni from :
Ze względu na przejrzystość lepiej jest jednak wyraźnie powiedzieć podczas importowania nazw z modułów, zamiast importować je wszystkie za pomocą „*”:
źródło
_names
są wywoływaneimport a
- są to dostępy, jaka._names
przy użyciu tego stylu.__init__.py
pliku. Zobacz tutaj o pomoc w tej sprawie.Python pozwala członkom klasy prywatnej z podwójnym prefiksem podkreślenia. Ta technika nie działa na poziomie modułu, więc myślę, że jest to błąd w Dive Into Python.
Oto przykład funkcji klasy prywatnej:
źródło
Możesz dodać funkcję wewnętrzną:
Coś takiego, jeśli naprawdę potrzebujesz takiego poziomu prywatności.
źródło
To starożytne pytanie, ale zmienne zniekształcone zarówno w module prywatnym (jeden podkreślnik), jak i prywatnym (dwa podkreślenia) są teraz objęte standardową dokumentacją:
Samouczek języka Python » Klasy » Zmienne prywatne
źródło
osadzone z zamknięciami lub funkcjami to jeden sposób. Jest to powszechne w JS, chociaż nie jest wymagane w przypadku platform innych niż przeglądarki lub pracowników przeglądarki.
W Pythonie wydaje się to trochę dziwne, ale jeśli coś naprawdę musi być ukryte, może to być droga. Bardziej do rzeczy przy użyciu API Pythona i trzymanie rzeczy, które wymagają ukrycia w C (lub innym języku) jest prawdopodobnie najlepszym sposobem. W przeciwnym razie wybrałbym wstawienie kodu do funkcji, wywołanie go i zwrócenie elementów, które chcesz wyeksportować.
źródło
Python ma trzy tryby:., Prywatny, publiczny i chroniony. Podczas importowania modułu dostępny jest tylko tryb publiczny. Takich prywatnych i chronionych modułów nie można wywoływać z zewnątrz modułu, tj. Kiedy jest importowany.
źródło