Zanurkuj w Pythonie/Obiekty i klasy: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Piotr (dyskusja | edycje)
Piotr (dyskusja | edycje)
Linia 228:
{{Infobox|
Według konwencji, pierwszy argument metody należącej do pewnej klasy (referencja do bieżącej instancji klasy) jest nazywana <tt>self</tt>. Argument ten pełni ten samą rolę, co zastrzeżone słowo <tt>this</tt> w C++ czy Javie, ale <tt>self</tt> nie jest zastrzeżonym słowem w Pythonie (zależy to od konwencji nazw). Niemniej lepiej zostać przy tej konwencji, ponieważ jest to wręcz bardzo silna umowa.}}
 
<big>'''Przykład 5.6. Kodowanie klasy FileInfo'''</big>
 
class FileInfo(UserDict):
"store file metadata"
def __init__(self, filename=None):
UserDict.__init__(self) #(1)
self["name"] = filename #(2)
#(3)
 
# Niektóre języki pseudo-zorientowane obiektowo jak ''Powerbuilder'' posiadają koncepcję „rozszeżania” konstruktorów i innych zdarzeń, w których metoda należąca do przodka jest wykonywana automatycznie przed metodą potomka. Python takiego czegoś nie wykonuje; zawsze należy wyraźnie wywołać odpowiednią metodę należącą do przodka klasy.
# Klasa ta działa podobnie jak słownik, co mogliśmy zauważyć po spojrzeniu na tę linię. Przypisaliśmy argument ''filename'' jako wartość klucza ''name'' w naszym obiekcie.
# Zauważmy, że metoda <tt>__init__</tt> nigdy nie zwraca żadnej wartości.
 
=== Kiedy używać self i __init__ ===
 
Podczas definiowania metody pewnej klasy, musimy wyraźnie wstawić <tt>self</tt> jako pierwszy argument każdej metody, włączając w to <tt>__init__</tt>. Kiedy wywołujesz metodę z dziedziczonej klasy, musisz dołączyć argument <tt>self</tt>. Lecz jeśli wywołujesz metodę z zewnątrz, nie określamy argumentu <tt>self</tt>, po prostu go pomijamy. Python automatycznie wstawi odpowiednią referencję za nas. Na początku może się to wydawać trochę namieszane, jednak wynika to z pewnych różnic, o których jeszcze nie wiemy (between bound and unbound methods).
 
{{Infobox|
Metoda <tt>__init__</tt> jest opcjonalna, lecz jeśli ją definiujesz, musisz pamiętać o wywołaniu metody <tt>__init__</tt>, która należy do przodka klasy. W szczególności, jeśli potomek chce poszerzyć pewne zachowanie przodka, odpowiednia metoda potomka musi w odpowiednim miejscu bezpośrednio wywoływać metodę należącą do przodka, oczywiście z odpowiednimi argumentami.}}
 
== Tworzenie instacji klas ==