<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl">
	<id>http://brain.fuw.edu.pl/edu/index.php?action=history&amp;feed=atom&amp;title=TI%2FProgramowanie_z_Pythonem%2FProgramowanie_zorientowane_obiektowo%2FZmienne_prywatne</id>
	<title>TI/Programowanie z Pythonem/Programowanie zorientowane obiektowo/Zmienne prywatne - Historia wersji</title>
	<link rel="self" type="application/atom+xml" href="http://brain.fuw.edu.pl/edu/index.php?action=history&amp;feed=atom&amp;title=TI%2FProgramowanie_z_Pythonem%2FProgramowanie_zorientowane_obiektowo%2FZmienne_prywatne"/>
	<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=TI/Programowanie_z_Pythonem/Programowanie_zorientowane_obiektowo/Zmienne_prywatne&amp;action=history"/>
	<updated>2026-04-20T01:42:53Z</updated>
	<subtitle>Historia wersji tej strony wiki</subtitle>
	<generator>MediaWiki 1.34.1</generator>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=TI/Programowanie_z_Pythonem/Programowanie_zorientowane_obiektowo/Zmienne_prywatne&amp;diff=1802&amp;oldid=prev</id>
		<title>Jarekz: Utworzono nową stronę &quot;W Pythonie są trzy różne kategorie nazw zaczynających się od podkreślenia, ale tak naprawdę nie mają one ze sobą dużo wspólnego. Najważniejsze są funkcje wy...&quot;</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=TI/Programowanie_z_Pythonem/Programowanie_zorientowane_obiektowo/Zmienne_prywatne&amp;diff=1802&amp;oldid=prev"/>
		<updated>2015-05-23T10:19:40Z</updated>

		<summary type="html">&lt;p&gt;Utworzono nową stronę &amp;quot;W Pythonie są trzy różne kategorie nazw zaczynających się od podkreślenia, ale tak naprawdę nie mają one ze sobą dużo wspólnego. Najważniejsze są funkcje wy...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nowa strona&lt;/b&gt;&lt;/p&gt;&lt;div&gt;W Pythonie są trzy różne kategorie nazw zaczynających się od&lt;br /&gt;
podkreślenia, ale tak naprawdę nie mają one ze sobą dużo&lt;br /&gt;
wspólnego. Najważniejsze są funkcje wywoływane automatycznie opisanej&lt;br /&gt;
[[../#Specjalne metody w Pythonie|gdzie indziej]], które mają po parze&lt;br /&gt;
podkreśleń na początku i na końcu. Oprócz tego występują zmienne&lt;br /&gt;
prywatne, zaczynające się od jednego lub dwóch podkreśleń. Takie&lt;br /&gt;
zmienne nie są przeznaczone do tego, by się do nich odwoływać z spoza&lt;br /&gt;
klasy czy modułu.&lt;br /&gt;
&lt;br /&gt;
W szczególności przy wywołaniu &amp;lt;tt&amp;gt;from ... import *&amp;lt;/tt&amp;gt;, czyli imporcie wszystkiego naraz, domyślnie dostajemy tylko nazwy niezaczynające się od podkreślenia.&lt;br /&gt;
&lt;br /&gt;
Rozróżnenie pomiędzy zmiennymi publicznymi i prywatnymi ma znaczenie w&lt;br /&gt;
przypadku modułów bibliotecznych &amp;amp;mdash; czyli takich które pełnią rolę&lt;br /&gt;
służebną wobec innych modułów dostarczając im metody do wywołania.&lt;br /&gt;
Programy definiowane przez użytkownika też składają się z modułów, ale&lt;br /&gt;
to jak zostaną nazwane zmienne i funkcji oraz jakim będą ulegać&lt;br /&gt;
zmianom wraz z rozwojem programu, jest tak naprawdę istotne tylko dla&lt;br /&gt;
autorów tego programu. Poniższe rozważania dotyczą więc modułów&lt;br /&gt;
przeznaczonych do wykorzystania przez innych, czyli w szczególności&lt;br /&gt;
modułów w standardowej bibliotece Pythona.&lt;br /&gt;
&lt;br /&gt;
Nazwy niepoprzedzone podkreśleniem są elementem &amp;quot;interfejsu&amp;quot;,&lt;br /&gt;
czyli mogą być wykorzystywane przez inne moduły i nie powinny ulegać&lt;br /&gt;
zmianie wraz z rozwojem modułu w którym są zadeklarowane.&lt;br /&gt;
Rozpoczęcie nazwy od pojedynczego podkreślenia oznacza, że ta zmienna&lt;br /&gt;
jest elementem implementacji, który może ulec zmianie. Nie oznacza to,&lt;br /&gt;
że do takiej zmiennej uniemożliwiony jest dostęp, ani nawet że nie&lt;br /&gt;
należy się do niej odwoływać. Pojedyncze podkreślenie ostrzega tylko&lt;br /&gt;
użytkownia przed tym, że dostęp do niej następuje na jego ryzyko.&lt;br /&gt;
&lt;br /&gt;
Nazwy poprzedzone podwójnym podkreśleniem zachowują się w sposób&lt;br /&gt;
szczególny. W trakcie wykonywania definicji (czyli przy czytaniu&lt;br /&gt;
programu), interpreter zamienia podwójne podkreślenie na specjalny&lt;br /&gt;
prefiks zależny od nazwy klasy czy modułu w którym następuje&lt;br /&gt;
definicja. Np. jesli zadeklarujemy pole &amp;lt;tt&amp;gt;__a&amp;lt;/tt&amp;gt; w klasie&lt;br /&gt;
&amp;lt;tt&amp;gt;A&amp;lt;/tt&amp;gt;, to zostanie utworzone pole o nazwie &amp;lt;tt&amp;gt;_A__a&amp;lt;/tt&amp;gt;,&lt;br /&gt;
poprzez połączenie nazwy klasy i pola. Celem tego podstawienia jest&lt;br /&gt;
to, by klasa dziedzicząca mogła swobodnie zdefiniować pole o takiej&lt;br /&gt;
samej nazwie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang='pycon'&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; class A(object):&lt;br /&gt;
...     __v = 1&lt;br /&gt;
...     def a(self):&lt;br /&gt;
...          return self.__v&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; class B(A):&lt;br /&gt;
...     __v = 2&lt;br /&gt;
...     def b(self):&lt;br /&gt;
...          return self.__v&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; a = A()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; print a.a()&lt;br /&gt;
1&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; b = B()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; print b.b()&lt;br /&gt;
2&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; print b.a() # !&lt;br /&gt;
1&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; b._B__v, b._A__v&lt;br /&gt;
(2, 1)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Widzimy, że mamy pole o pozornie takiej samej nazwie (&amp;lt;tt&amp;gt;__v&amp;lt;/tt&amp;gt;),&lt;br /&gt;
wykorzystywane przez &amp;lt;tt&amp;gt;A.a&amp;lt;/tt&amp;gt; i &amp;lt;tt&amp;gt;B.b&amp;lt;/tt&amp;gt;, bez&lt;br /&gt;
konfliktu. Oczywiście tak jak pokazuje ostatnia linijka, dostęp do pól&lt;br /&gt;
&amp;quot;prywatnych&amp;quot; nie jest szczególnie trudny, nawet spoza danej klasy.&lt;br /&gt;
&lt;br /&gt;
Ponieważ wykorzystanie zmiennych prywatnych (z _ i __), nie jest&lt;br /&gt;
w żaden sposób utrudnione, można by się zapytać, jaki jest ich sens? Okazuje się, że te pierwsze (z pojedynczym podkreśleniem) mają sens, bo mówią o intencjach, natomiast te drugie są raczej ukłonem w stronę programistów przyzwyczajonych do innych języków programowania i wielekiego sensu w Pythonie nie mają.&lt;br /&gt;
Żartobliwe motto strzeszczające dostęp do zmiennych &amp;quot;prywantych&amp;quot; w Pythonie brzmi &amp;quot;we are all consenting adults here&amp;quot;. Ta fraza jest takim elementem Pythonowego folkloru, ale symbolizuje zdecydowanie poważną&lt;br /&gt;
filozofię. Skoro programista może użyć dostępnych funkcji w niewłaściwy sposób i napisać niepoprawny program na tysiąc sposobów, skoro można nawet zmienić kod innych klas w trakcie działania programu, to wymuszanie reguł dostępu do niektórych pól przez interpreter byłoby tylko stratą czasu. Oczywiście zawsze należy chronić się przez pomyłkami, więc zmienne &amp;quot;prywatne&amp;quot; są w czytelny sposób oznaczone podkreśleniem &amp;amp;mdash; i kiedy się ich używa z zewnątrz, to jest to dozwolone, ale tylko na własną odpowiedzialność. Ogólna zasada jest taka, że zmienne prywatne zdefiniowane w obiektach bibliotecznych mogą się zmienić z wersji na wersję, wedle widzimisię autorów tych bibliotek. Natomiast w przypadku zmiennych publicznych, a zwłaszcza udokumentowanych zmiennych publicznych, możemy oczekiwać, że nie ulegną one niekompatybilnej zmianie w nowszych wersjach bez istotnego powodu. Zmienne podwójnie prywatne (z &amp;quot;__&amp;quot;) są natomiast używane znacznie rzadziej.&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
</feed>