Co oznacza pojedynczy i podwójny podkreślenie przed nazwą obiektu?
Czy ktoś może wyjaśnić dokładne znaczenie podkreślenia wiodącego przed nazwą obiektu w Pythonie i różnicę między nimi?
Czy ta wartość pozostaje niezmieniona niezależnie od tego, czy dany obiekt jest zmienną, funkcją, metodą itp.?
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
15 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
Jeden znak podkreślenia
>
Nazwy klas z podkreśleniem wiodącym po prostu wskazują innym programistom, że atrybut lub metoda jest przeznaczona do użytku prywatnego. Jednak z samą nazwą nie robi się nic specjalnego.
Zacytować
PEP-8
http://www.python.org/dev/peps/pep-0008/
:
_single_leading_underscore: słaby wskaźnik „użytku wewnętrznego”. Np. nie importuje obiektów, których nazwa zaczyna się od podkreślenia.
Podwójne podkreślenie (zniekształcenie nazwy)
>
Z
dokumenty
https://docs.python.org/3/tuto ... ables
Python :
Każdy identyfikator w postaci (co najmniej dwa wiodące podkreślenia, co najwyżej jedno końcowe podkreślenie) jest zastępowany tekstowo przez , gdzie to nazwa aktualnej klasy z przekreślonymi początkowymi podkreśleniami. To zniekształcenie jest wykonywane bez względu na składniową pozycję identyfikatora, więc może być używane do definiowania prywatnej klasy instancji i zmiennych klas, metod, zmiennych przechowywanych w globalnych, a nawet zmiennych przechowywanych w instancjach. zamknięte dla tej klasy na instancjach innych klas.
I ostrzeżenie z tej samej strony:
Manglowanie nazw ma na celu zapewnienie klasom łatwego sposobu definiowania „prywatnych” zmiennych i metod instancji bez martwienia się o zmienne instancji zdefiniowane przez klasy pochodne lub kod poza klasą modyfikuje zmienne instancji. Należy pamiętać, że zasady dotyczące wprowadzania w błąd mają na celu przede wszystkim unikanie wypadków; dusza nadal może uzyskać dostęp lub zmienić zmienną uważaną za prywatną.
Przykład
>
Anonimowy użytkownik
Potwierdzenie od:
po prostu
konwencja: jeśli używasz i moduł nie definiuje listy , nazwy importowane z modułu są
nie
zawierają nazwy z początkowymi podkreśleniami. Powiedzmy, że jest w środku
gruntownie
konwencją, ponieważ ten przypadek jest raczej ciemnym zakątkiem; -).
Początkowa konwencja podkreślenia jest szeroko stosowana nie tylko dla nazw prywatnych, ale także dla tego, co C ++ nazwałoby chronionym-
na przykład nazwy metod, które mają być całkowicie zastąpione przez podklasy (nawet
te, które muszą zostać przesłonięte, ponieważ w klasie bazowej! -) są często nazwami z pojedynczym początkowym podkreśleniem, które wskazują kodowi używającemu wystąpień tej klasy (lub podklas), że określone metody nie mają być wywoływane bezpośrednio.
Na przykład, aby utworzyć kolejkę bezpieczną wątkowo z inną dyscypliną kolejkowania niż FIFO, należy zaimportować kolejkę, podklasy Queue.Queue i zastąpić metody, takie jak i ; „kod klienta” nigdy nie wywołuje tych metod („hook”), ale raczej metody publiczne („organizujące”), takie jak i (jest to znane jako wzorzec projektowy metoda szablonowa - zobacz np. ciekawą prezentację na podstawie wideo z mojej rozmowy na ten temat, z dodatkiem krótkich transkrypcji).
Edycja: linki do wideo w opisie negocjacji już nie działają. Możesz znaleźć pierwsze dwa filmy
tutaj
https://www.youtube.com/watch?v=1Sbzmz1Nxvo
i
tutaj
https://www.youtube.com/watch?v=tJXhtncDBu4
.
Anonimowy użytkownik
Potwierdzenie od:
: To jest tylko konwencja, sposób dla programisty na wskazanie, że zmienna jest prywatna (cokolwiek to oznacza w Pythonie).
: to robi prawdziwą różnicę: interpreter zastępuje tę nazwę , aby upewnić się, że nazwa nie pokrywa się z podobną nazwą w innej klasie.
Żadna inna forma podkreślenia nie ma znaczenia w świecie Pythona.
W tych konwencjach nie ma różnicy między klasą, zmienną, globalną itp.
Anonimowy użytkownik
Potwierdzenie od:
is often incorrectly considered superprivate, while it's actual meaning is just to namemangle to
prevent accidental access
[1]
https://www.youtube.com/watch% ... 33m8s
is typically reserved for builtin methods or variables
You can still access variables if you desperately want to. The double underscores just namemangles, or renames, the variable to something like Przykład:
t._b jest dostępny, ponieważ jest ukryty tylko przez konwencję
t .__ a nie znaleziono, ponieważ już nie istnieje z powodu pomyłki w nazewnictwie
Odwołując się do zamiast prostego podwójnego podkreślenia na nazwie, można uzyskać dostęp do ukrytej wartości
Anonimowy użytkownik
Potwierdzenie od:
Jedno podkreślenie na początku
:
Python nie ma prawdziwych prywatnych metod. Zamiast tego pojedynczy znak podkreślenia na początku nazwy metody lub atrybutu oznacza, że nie należy odwoływać się do tej metody, ponieważ nie jest ona częścią interfejsu API.
(Ten fragment kodu został pobrany ze źródła django: django/form/forms.py). W tym kodzie jest własnością publiczną, ale metoda, którą wywołuje ta właściwość, _get_errors, jest „prywatna”, więc nie należy się do niej odwoływać.
Na początku dwa podkreślenia
:
To powoduje wiele zamieszania. Nie należy go używać do tworzenia metody prywatnej. Należy go używać, aby uniknąć przesłonięcia metody przez podklasę lub przypadkowego uzyskania do niej dostępu. Weźmy przykład:
Wynik:
Teraz podklasa B i skonfiguruj metodę __test
Wyjście będzie ....
Jak już widzieliśmy, A.test () nie wywołała metod B .__ test (), jak można by się spodziewać. Ale w rzeczywistości jest to prawidłowe zachowanie dla __. Dwie metody o nazwie __test () są automatycznie zmieniane (zniekształcane) na _A__test () i _B__test (), więc nie są one przypadkowo zastępowane. Kiedy tworzysz metodę, która zaczyna się od __, oznacza to, że nie chcesz, aby ktokolwiek mógł ją nadpisać, a będziesz mieć do niej dostęp tylko z własnej klasy.
Dwa podkreślenia na początku i na końcu
:
Kiedy widzimy metodę taką jak , nie wywołuj jej. To jest metoda, którą powinien wywołać Python, a nie ty. Zobaczmy:
Zawsze istnieje operator lub funkcja niestandardowa, która wywołuje te magiczne metody. Czasami jest to tylko podpórka do wywołań Pythona w pewnych sytuacjach. Na przykład jest wywoływana, gdy obiekt jest tworzony po wywołaniu w celu utworzenia instancji ...
Weźmy przykład ...
Więcej informacji znajdziesz w
przywództwo
https://www.python.org/dev/pep ... ables
PEP-8. Więcej informacji na temat magicznych metod znajdziesz w
ten artykuł PDF
//github.com/RafeKettler/magicmethods/blob/master/magicmethods.pdf
.
Anonimowy użytkownik
Potwierdzenie od:
W tym przypadku _ () jest aliasem funkcji lokalizacyjnej, która operuje na tekście, aby przetłumaczyć go na odpowiedni język itp. W oparciu o ustawienia regionalne. Na przykład Sfinks to robi, a znajdziesz wśród importów
aw sphinx.locale _ () jest przypisane jako alias dla niektórych funkcji lokalizacyjnych.
Anonimowy użytkownik
Potwierdzenie od:
występ
https://www.youtube.com/watch% ... 33m8s
Raymonda, ułatwię to trochę, zapisując to, co powiedział:
Zamiar podwójnego podkreślenia nie był związany z prywatnością. Zamierzałem to wykorzystać w ten sposób
Właściwie to przeciwieństwo prywatności, chodzi o wolność. Dzięki temu Twoje podklasy mogą swobodnie zastępować jedną metodę bez przerywania innych.
.
Załóżmy, że nie przechowujesz lokalnego linku w . Klasa pochodna zastępuje teraz implementację bez dotykania . Kiedy wywołujesz , teoretycznie powinien nadal używać do obliczeń, ale w rzeczywistości używa , co nie jest zamierzonym zachowaniem. Dlatego potrzebujemy lokalnego łącza w kręgu. [/code]Ale dlaczego zamiast ? Ponieważ nadal daje klasie pochodnej możliwość przesłonięcia:
Podwójne podkreślenia mają zniekształcone nazwy, więc jest bardzo mała szansa, że lokalne odwołanie w klasie nadrzędnej zostanie nadpisane w klasie pochodnej. zatem "
sprawia, że Twoje podklasy mogą swobodnie zastępować jedną metodę bez przerywania innych
".
O ile Twoja klasa nie zostanie odziedziczona lub zastąpienie metody niczego nie zepsuje, po prostu nie potrzebujesz .
Anonimowy użytkownik
Potwierdzenie od:
https://dbader.org/blog/meanin ... ython
https://dbader.org/blog/meanin ... ython
Anonimowy użytkownik
Potwierdzenie od:
Zdaję sobie sprawę, że OP zadał nieco inne pytanie, ale ponieważ znalazłem inne pytanie z pytaniem „jak ustawić zmienne prywatne” oznaczone duplikatem z tym, pomyślałem o dodaniu tutaj dodatkowych informacji.
Anonimowy użytkownik
Potwierdzenie od:
Wartość:
jakaś_zmienna - ► to jest publiczne, każdy może to zobaczyć.
_kilka_zmienna --► w miejscu publicznym ktoś może to zobaczyć, ale jest to konwencja na oznaczenie własnego ...
ostrzeżenie
Python nie wymusza żadnego przymusu.
__some_varaible --► Python zamienia nazwę zmiennej na _classname__some_varaible (zmiana nazwy AKA), co zmniejsza/ukrywa jej widoczność i bardziej przypomina zmienną prywatną.
Szczerze mówiąc, tutaj w
zgodnie z dokumentacją
https://docs.python.org/3/tuto ... ivate
Python
„Prywatne” zmienne instancji, dostęp
które są dostępne tylko z poziomu obiektu, nie istnieją w Pythonie "
Przykład:
Anonimowy użytkownik
Potwierdzenie od:
Podwójne początkowe i końcowe podkreślenia są używane dla wbudowanych metod, takich jak , itp.
Podwójne początkowe podkreślenia bez końcowych odpowiedników są również konwencją, jednak metody klasowe będą
zniekształcony
http://docs.python.org/tutoria ... ables
interpretator. Nie ma różnicy w przypadku zmiennych lub nazw funkcji bazowych.
Anonimowy użytkownik
Potwierdzenie od:
Ale nazwy __double_underscore nie są zniekształcane w modułach, np. Dzieje się tak, że nazwy zaczynające się od jednego (lub więcej) podkreślenia nie są importowane, jeśli importujesz wszystko z modułu (z modułu import *), a także nazwy wyświetlane w pomocy (moduł).
Anonimowy użytkownik
Potwierdzenie od:
jeśli następnie utworzysz instancję podrzędną w pythonowym REPL, zobaczysz następujące
Dla niektórych może to być oczywiste, ale zaskoczyło mnie to w znacznie bardziej złożonym otoczeniu.
Anonimowy użytkownik
Potwierdzenie od:
połączyć
https://docs.python.org/2/ tutorial/classes.html # private-variable-and-class-local-reference
https://docs.python.org/2/tuto ... ences
Anonimowy użytkownik
Potwierdzenie od:
Tak to widzę:
Powinien być używany do wskazania, że funkcja nie jest przeznaczona do użytku publicznego, na przykład interfejs API. To oraz ograniczenie importu sprawiają, że zachowuje się on bardzo podobnie do w języku c #.
Powinien być używany w celu uniknięcia kolizji nazw w dziedziczeniu hirarchicznym i późnego wiązania. Bardzo podobny do prywatnego w C #. rok
==>
Jeśli chcesz wskazać, że coś nie jest przeznaczone do użytku publicznego, ale powinno działać jako , użyj .
Jeśli chcesz wskazać, że coś nie jest do użytku publicznego, ale powinno działać jak , użyj .
To również cytat, który bardzo mi się podoba:
Problem w tym, że autor zajęć może zasadnie myśleć, że „to
nazwa atrybutu/metody musi być prywatna, dostępna tylko z
ta definicja klasy ”i użyj konwencji __private. Ale później ...,
użytkownik tej klasy może utworzyć podklasę, której jest to uzasadnione
w dostępie do tej nazwy. Zatem albo superklasa musi zostać zmieniona
(co może być trudne lub niemożliwe), a kod podklasy powinien
używaj ręcznie zniekształconych nazw (co jest w najlepszym przypadku brzydkie i delikatne).
Ale problem z tym polega na tym, że moim zdaniem, jeśli nie ma IDE, które ostrzega, kiedy zastępujesz metody, znalezienie błędu może zająć trochę czasu, jeśli przypadkowo przesłonisz metodę z klasy bazowej.