| | Temat wykladu: |
| | Python: Programowanie obiektowe (by JaBoJa, 2006-11-24) @ wyklady.net |
| | Komentarze: http://forum.wyklady.net/index.php?topic=88 |
21:07 | jaboja | Przepraszam za poczatkowe zamieszanie |
21:08 | jaboja | tematem dzisiejszego wykladu jest programowanie obiektowe w Pythonie, na poczatek jednak wyjasnie czym wogole sa obiekty |
21:09 | jaboja | posluze sie tu analogia do jezyka Pascal i jego elementu jakim sa rekordy |
| jaboja | rekord jest typem mogacym zawierac kilka pol o zdefiniowanych typach np. |
| jaboja | var x: record |
21:10 | jaboja | a: integer; |
| jaboja | b: string; |
| jaboja | end; |
| jaboja | { potem mozemy sie do tych pol rekordu odwolywac poprzez operator kropki: } |
| jaboja | writeln(x.a, x.b); |
21:11 | jaboja | obiekty sa czyms idacym nieco dalej |
| jaboja | co je od rekordow rozni: |
| jaboja | 1. Moga zawierac nie tylko zmienne, ale rowniez funkcje (tzn. metody) |
| jaboja | 2. Moga po sobie dziedziczyc (wyjasnie to w dalszej czesci wykladu) |
21:12 | jaboja | zadeklarujmy wiec sobie najprostrza klase w pythonie i stworzmy obiekt (klasa to obiektowy typ danych, obiekt to zmienna tego typu): |
| jaboja | class x: |
| jaboja | a=1 |
| jaboja | b="abc" |
21:13 | jaboja | i tu pewna uwaga: w Pythonie nie definiujemy tych zmiennych (tzw. skladowych), zmienna jest tworzona w momencie przypisania jej wartosci |
21:14 | jaboja | teraz utworzmy obiekt (zmienna): |
| jaboja | y=new x() |
| jaboja | print y.a |
| jaboja | print y.b |
| jaboja | print y |
| jaboja | y.a = y.b |
| jaboja | print y.a |
| jaboja | wprowadzmy wiec ten kod do interpretera pythona, oto co otrzymamy: |
21:15 | jaboja | / przepraszam, do kodu wkradl sie blad, w Pythonie nie ma slowa kluczowego "new" (nawyki z C++ wylaza :p) |
21:16 | jaboja | >>> print y.a |
| jaboja | 1 |
| jaboja | >>> print y.b |
| jaboja | abc |
| jaboja | print y |
21:17 | jaboja | <__main__.x instance at 0xb7d931cc> |
| jaboja | >>> y.a=y.b |
| jaboja | >>> print y.a |
| jaboja | abc |
21:18 | jaboja | Ciekawe jest tu to co wypisuje interpreter po wydaniu komendy "print y" |
| jaboja | pokazuje to nam ze y nie jest zwykla tablica asocjacyjna, tylko zmienna klasy __main__.x |
21:19 | jaboja | wczesniej napisalem ze obiekty w przeciwienstwie do rekordow moga zawierac funkcje (metody), pokazmy wiec to: |
| jaboja | class m: |
21:20 | jaboja | def ustaw(self, x): |
| jaboja | self.x=x |
| jaboja | n=m() |
21:21 | jaboja | n.ustaw(12) |
| jaboja | print n.x |
| jaboja | program wypisze nam liczbe 12 |
| jaboja | trzeba jednak w tym miejscu zwrocic uwage na pewna kwestie: |
21:22 | jaboja | definicja metody jest funkcja dwoch zmiennych, zas potem odwolujemy sie do niej jak do funkcji jednej zmiennej |
21:23 | jaboja | jest 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) |
| jaboja | w 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:24 | jaboja | skoro jestesmy przy metodach to trzeba zwrocic jeszcze uwage na pewna szczegolna z nich: konstruktor |
| jaboja | jest ona automatycznie wywolywana w momencie tworzenia obiektu, vide: |
| jaboja | class c: |
| jaboja | def __init__(self): |
21:25 | jaboja | print "abc" |
| jaboja | self.x="def" |
| jaboja | d = c() |
| jaboja | print d.x |
21:26 | jaboja | co ciekawe interpreter zareaguje tu juz w momencie tworzenia obiektu: |
| jaboja | d=c() |
| jaboja | wypisujac abc |
21:27 | jaboja | dzieje 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 |
| jaboja | konstruktor moze terz przyjmowac parametry, wtedy w momencie tworzenia obiektu bedziemy zmuszeni do ich podania: |
| jaboja | class e: |
| jaboja | def __init__(self, a): |
| jaboja | print a |
21:28 | jaboja | co istotne pierwsza zmienna - self - musi byc uwzgledniana nawet jak z niej nie korzystamy |
21:29 | jaboja | pokaze to na przykladzie: |
| jaboja | class rzecz: |
| jaboja | def nazwa(self): |
21:30 | jaboja | print "rzecz" |
| jaboja | class krzeslo(rzecz): |
| jaboja | def __init__(self): |
| jaboja | self.nazwa() |
| jaboja | class zle(rzecz): |
21:31 | jaboja | def __init__(nazwa): |
| jaboja | print nazwa |
| jaboja | przy okazji dodalem cos o czym powiem za chwile |
| jaboja | dla naz wazne jest natomiast to ze wywolujac taki kod nie uzyskamy pozadanego wyniku: |
21:32 | jaboja | z=zle('krowa') |
21:33 | jaboja | oczekiwalibysmy ze konstruktor wypisze slowo "krowa" |
| jaboja | wypisze on jednak informacje o naszym obiekcie |
| Afro_PL | re |
| jaboja | druga zecz ktora maja ukazywac powyrzesz przyklady to tzw. dziedziczenie |
21:34 | jaboja | na pierwszy rzut oka definicja zle(rzecz) wyglada jak przekazanie zmiennej |
| jaboja | jest to jednak definicja klasy dziedziczacej z klasy rzecz |
| jaboja | dla przykladu stworzmy wiec obiekt klasy krzeslo: |
| jaboja | k=krzeslo() |
| jaboja | rzecz |
21:35 | jaboja | konstruktor wywolal bowiem metode z klasy z ktorej dziedziczymy |
| jaboja | oczywiscie jesli chcemy mozemy zdefiniowac metode o tej samej nazwie wtedy konstruktor by wywolal ja |
21:36 | jaboja | (wszystkie metody w Pythonie sa wirtualne, w przeciwienstwie do c++) |
| jaboja | mozna ta ceche wykorzystac nastepujaco: |
21:37 | jaboja | class a: |
| jaboja | def m(self): |
| jaboja | return 1 |
| jaboja | class b: |
| jaboja | def m(self): |
| jaboja | return 2 |
| jaboja | def test(x): |
| jaboja | print test.m() |
21:38 | jaboja | test(a()) |
| jaboja | test(b()) |
21:39 | jaboja | w 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 |
| jaboja | i wazne jest tylko zeby mialy ta sama nazwe |
21:40 | jaboja | mozna w ten sposob dziedziczac dodawac do klas potomnych nowe funkcjonalnosci, z ktorych beda kozystac klasy bazowe "nie wiedzac" nawet o tym |
21:41 | jaboja | na tym chcialbym zakonczyc, dla poczatkujacych wystarczy, a jesli byloby zainteresowanie jakimis bardziej zlozonymi problemami to chetnie poprowadze kolejny wyklad (prosze o kontakt GG: 5272867) |
| jaboja | sa pytania? |
| j00ru | ;> |
| j00ru | nee ;> |
21:42 | jaboja | dobranoc |
| j00ru | hehe |