Temat wykladu:
Python: Programowanie obiektowe (by JaBoJa, 2006-11-24) @ wyklady.net
Komentarze: http://forum.wyklady.net/index.php?topic=88
21:07jabojaPrzepraszam za poczatkowe zamieszanie
21:08jabojatematem dzisiejszego wykladu jest programowanie obiektowe w Pythonie, na poczatek jednak wyjasnie czym wogole sa obiekty
21:09jabojaposluze sie tu analogia do jezyka Pascal i jego elementu jakim sa rekordy
jabojarekord jest typem mogacym zawierac kilka pol o zdefiniowanych typach np.
jabojavar x: record
21:10jabojaa: integer;
jabojab: string;
jabojaend;
jaboja{ potem mozemy sie do tych pol rekordu odwolywac poprzez operator kropki: }
jabojawriteln(x.a, x.b);
21:11jabojaobiekty sa czyms idacym nieco dalej
jabojaco je od rekordow rozni:
jaboja1. Moga zawierac nie tylko zmienne, ale rowniez funkcje (tzn. metody)
jaboja2. Moga po sobie dziedziczyc (wyjasnie to w dalszej czesci wykladu)
21:12jabojazadeklarujmy wiec sobie najprostrza klase w pythonie i stworzmy obiekt (klasa to obiektowy typ danych, obiekt to zmienna tego typu):
jabojaclass x:
jabojaa=1
jabojab="abc"
21:13jabojai tu pewna uwaga: w Pythonie nie definiujemy tych zmiennych (tzw. skladowych), zmienna jest tworzona w momencie przypisania jej wartosci
21:14jabojateraz utworzmy obiekt (zmienna):
jabojay=new x()
jabojaprint y.a
jabojaprint y.b
jabojaprint y
jabojay.a = y.b
jabojaprint y.a
jabojawprowadzmy wiec ten kod do interpretera pythona, oto co otrzymamy:
21:15jaboja/ przepraszam, do kodu wkradl sie blad, w Pythonie nie ma slowa kluczowego "new" (nawyki z C++ wylaza :p)
21:16jaboja>>> print y.a
jaboja1
jaboja>>> print y.b
jabojaabc
jabojaprint y
21:17jaboja<__main__.x instance at 0xb7d931cc>
jaboja>>> y.a=y.b
jaboja>>> print y.a
jabojaabc
21:18jabojaCiekawe jest tu to co wypisuje interpreter po wydaniu komendy "print y"
jabojapokazuje to nam ze y nie jest zwykla tablica asocjacyjna, tylko zmienna klasy __main__.x
21:19jabojawczesniej napisalem ze obiekty w przeciwienstwie do rekordow moga zawierac funkcje (metody), pokazmy wiec to:
jabojaclass m:
21:20jabojadef ustaw(self, x):
jabojaself.x=x
jabojan=m()
21:21jabojan.ustaw(12)
jabojaprint n.x
jabojaprogram wypisze nam liczbe 12
jabojatrzeba jednak w tym miejscu zwrocic uwage na pewna kwestie:
21:22jabojadefinicja metody jest funkcja dwoch zmiennych, zas potem odwolujemy sie do niej jak do funkcji jednej zmiennej
21:23jabojajest tak dlatego ze Python w przeciwienstwie do np C++ przkazuje obiekt ktorego metode wywolano jako pierwszy parametr funkcji, a nie tworzy zmienna o nazwie this (jak w C++) albo self (jak w Object Pascalu)
jabojaw tym przypadku zmienna ta nazywa sie self, ale mozna sobie ja nazwac jak tylko chcemy (no moze poza slowami takimi jak for, def, import itp.)
21:24jabojaskoro jestesmy przy metodach to trzeba zwrocic jeszcze uwage na pewna szczegolna z nich: konstruktor
jabojajest ona automatycznie wywolywana w momencie tworzenia obiektu, vide:
jabojaclass c:
jabojadef __init__(self):
21:25jabojaprint "abc"
jabojaself.x="def"
jabojad = c()
jabojaprint d.x
21:26jabojaco ciekawe interpreter zareaguje tu juz w momencie tworzenia obiektu:
jabojad=c()
jabojawypisujac abc
21:27jabojadzieje sie tak dlatego ze wywolanie c() jest w istocie wywolaniem konstruktora, we wczesniejszych przypadkach byl to standardowy konstruktor ktory nic poza stworzeniem obiektu nie robil, teraz zas zdefiniowalismy wlasny
jabojakonstruktor moze terz przyjmowac parametry, wtedy w momencie tworzenia obiektu bedziemy zmuszeni do ich podania:
jabojaclass e:
jabojadef __init__(self, a):
jabojaprint a
21:28jabojaco istotne pierwsza zmienna - self - musi byc uwzgledniana nawet jak z niej nie korzystamy
21:29jabojapokaze to na przykladzie:
jabojaclass rzecz:
jabojadef nazwa(self):
21:30jabojaprint "rzecz"
jabojaclass krzeslo(rzecz):
jabojadef __init__(self):
jabojaself.nazwa()
jabojaclass zle(rzecz):
21:31jabojadef __init__(nazwa):
jabojaprint nazwa
jabojaprzy okazji dodalem cos o czym powiem za chwile
jabojadla naz wazne jest natomiast to ze wywolujac taki kod nie uzyskamy pozadanego wyniku:
21:32jabojaz=zle('krowa')
21:33jabojaoczekiwalibysmy ze konstruktor wypisze slowo "krowa"
jabojawypisze on jednak informacje o naszym obiekcie
Afro_PLre
jabojadruga zecz ktora maja ukazywac powyrzesz przyklady to tzw. dziedziczenie
21:34jabojana pierwszy rzut oka definicja zle(rzecz) wyglada jak przekazanie zmiennej
jabojajest to jednak definicja klasy dziedziczacej z klasy rzecz
jabojadla przykladu stworzmy wiec obiekt klasy krzeslo:
jabojak=krzeslo()
jabojarzecz
21:35jabojakonstruktor wywolal bowiem metode z klasy z ktorej dziedziczymy
jabojaoczywiscie jesli chcemy mozemy zdefiniowac metode o tej samej nazwie wtedy konstruktor by wywolal ja
21:36jaboja(wszystkie metody w Pythonie sa wirtualne, w przeciwienstwie do c++)
jabojamozna ta ceche wykorzystac nastepujaco:
21:37jabojaclass a:
jabojadef m(self):
jabojareturn 1
jabojaclass b:
jabojadef m(self):
jabojareturn 2
jabojadef test(x):
jabojaprint test.m()
21:38jabojatest(a())
jabojatest(b())
21:39jabojaw C++ musialbym jeszcze zadeklarowac klase z ktorej dziedzicza klasy a i b, zeby moc obiekty obu z nich przekazac do jednej funkcji, ale w pythonie nie jest to konieczne, bo jest jezykiem interpretowanym
jabojai wazne jest tylko zeby mialy ta sama nazwe
21:40jabojamozna w ten sposob dziedziczac dodawac do klas potomnych nowe funkcjonalnosci, z ktorych beda kozystac klasy bazowe "nie wiedzac" nawet o tym
21:41jabojana tym chcialbym zakonczyc, dla poczatkujacych wystarczy, a jesli byloby zainteresowanie jakimis bardziej zlozonymi problemami to chetnie poprowadze kolejny wyklad (prosze o kontakt GG: 5272867)
jabojasa pytania?
j00ru;>
j00runee ;>
21:42jabojadobranoc
j00ruhehe