Wydaje się, że to „podkreślanie” zdarza się często i zastanawiałem się, czy to wymaganie w języku Python, czy tylko kwestia konwencji?
Ponadto, czy ktoś mógłby nazwać i wyjaśnić, które funkcje mają podkreślenia i dlaczego ( __init__
na przykład)?
python
function
methods
double-underscore
Chuck testa
źródło
źródło
Odpowiedzi:
Z Python PEP 8 - Przewodnik po stylu dla kodu Python :
Zauważ, że nazwy z podwójnymi wiodącymi i końcowymi podkreśleniami są zasadniczo zarezerwowane dla samego Pythona: „Nigdy nie wymyślaj takich nazw, używaj ich tylko zgodnie z dokumentacją”.
źródło
__double_leading_underscore
jest nadal publiczny , zmieniono nazwę zmiennej, aby uniknąć kolizji.Inni respondenci słusznie opisują podwójne wiodące i końcowe znaki podkreślające jako konwencję nazewnictwa dla metod „specjalnych” lub „magicznych”.
Chociaż można wywoływać te metody bezpośrednio (
[10, 20].__len__()
na przykład), obecność znaków podkreślenia jest wskazówką, że metody te mają być wywoływane pośrednio (len([10, 20])
na przykład). Większość operatorów Pythona ma powiązaną metodę „magiczną” (na przykłada[x]
jest to zwykły sposób wywoływaniaa.__getitem__(x)
).źródło
Nazwy otoczone podwójnymi podkreśleniami są „specjalne” dla Pythona. Są one wymienione w Python Language Reference, sekcja 3, „Model danych” .
źródło
Właściwie używam nazw metod _, gdy muszę rozróżniać nazwy klas nadrzędnych i podrzędnych. Przeczytałem kilka kodów, które wykorzystały ten sposób tworzenia klas rodzic-dziecko. Jako przykład mogę podać ten kod:
...
i dziecko, które ma metodę _worker
...
źródło
Konwencja ta jest stosowana do specjalnych zmiennych lub metod (tak zwana „metoda magiczna”), takich jak
__init__
i__len__
. Te metody zapewniają specjalne funkcje składniowe lub specjalne rzeczy.Na przykład
__file__
wskazuje lokalizację pliku Python,__eq__
jest wykonywany, gdya == b
wyrażenia.Użytkownik może oczywiście stworzyć niestandardową metodę specjalną, co jest bardzo rzadkim przypadkiem, ale często może zmodyfikować niektóre wbudowane metody specjalne (np. Powinieneś zainicjować klasę,
__init__
która zostanie wykonana na początku, gdy wystąpi klasa jest tworzone).źródło
Dodano przykład, aby zrozumieć użycie __ w pythonie. Oto lista wszystkich __
https://docs.python.org/3/genindex-all.html#_
Ograniczenie dostępu za pomocą __
źródło