Programowanie Obiektowe W Pythonie







Python: Programowanie obiektowe (by JaBoJa, 2006-11-24) @ wyklady.net

@charset "iso-8859-2";
*{
vertical-align: top;
font-family: Arial;
font-size: 12px;
color: #000;
background-color: #FFF;
margin: 0;
}
table {
border-collapse: collapse;
}
td {
vertical-align: top;
padding: 3px 5px;
}
.time{
white-space: nowrap;
color: gray;
background-color: #F7F7F7;
}
.sender{
background-color: #F7F7F7;
text-align: right;
white-space: nowrap;
color: #000099;
}
.msg-sender{
}
.self{
background-color: #F7F7F7;
text-align: right;
white-space: nowrap;
color: #900;
}
.msg-self {
font-weight: bolder;
}
div.highlight {
display: table-cell;
}
a {
color: #900;
}
a:hover {
color: #808080;
text-decoration: none;
}
.code{
font-weight: bolder;
color: #00b;
font-family: monospace;
}
div.con{
margin-top: -5px;
margin-bottom: -5px;
width: 500px;
font-weight: bolder;
background-color: #d0d0d0;
padding: 5px;
font-family: monospace;
}
span.bold{
font-weight: bold;
}

Temat wykladu:Python: Programowanie obiektowe (by JaBoJa, 2006-11-24) @ wyklady.netKomentarze: http://forum.wyklady.net/index.php?topic=8821:07jabojaPrzepraszam za poczatkowe zamieszanie21:08jabojatematem dzisiejszego wykladu jest programowanie obiektowe w Pythonie, na poczatek jednak wyjasnie czym wogole sa obiekty21:09jabojaposluze sie tu analogia do jezyka Pascal i jego elementu jakim sa rekordyjabojarekord jest typem mogacym zawierac kilka pol o zdefiniowanych typach np.jabojavar x: record21: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 dalejjabojaco 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=1jabojab="abc"21:13jabojai tu pewna uwaga: w Pythonie nie definiujemy tych zmiennych (tzw. skladowych), zmienna jest tworzona w momencie przypisania jej wartosci21:14jabojateraz utworzmy obiekt (zmienna):jabojay=new x()jabojaprint y.ajabojaprint y.bjabojaprint yjabojay.a = y.bjabojaprint y.ajabojawprowadzmy 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.ajaboja1jaboja>>> print y.bjabojaabcjabojaprint y21:17jaboja<__main__.x instance at 0xb7d931cc>jaboja>>> y.a=y.bjaboja>>> print y.ajabojaabc21: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__.x21:19jabojawczesniej napisalem ze obiekty w przeciwienstwie do rekordow moga zawierac funkcje (metody), pokazmy wiec to:jabojaclass m:21:20jabojadef ustaw(self, x):jabojaself.x=xjabojan=m()21:21jabojan.ustaw(12)jabojaprint n.xjabojaprogram wypisze nam liczbe 12jabojatrzeba 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 zmiennej21: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: konstruktorjabojajest ona automatycznie wywolywana w momencie tworzenia obiektu, vide:jabojaclass c:jabojadef __init__(self):21:25jabojaprint "abc"jabojaself.x="def"jabojad = c()jabojaprint d.x21:26jabojaco ciekawe interpreter zareaguje tu juz w momencie tworzenia obiektu:jabojad=c()jabojawypisujac abc21: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 wlasnyjabojakonstruktor moze terz przyjmowac parametry, wtedy w momencie tworzenia obiektu bedziemy zmuszeni do ich podania:jabojaclass e:jabojadef __init__(self, a):jabojaprint a21:28jabojaco istotne pierwsza zmienna - self - musi byc uwzgledniana nawet jak z niej nie korzystamy21: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 nazwajabojaprzy okazji dodalem cos o czym powiem za chwilejabojadla 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 obiekcieAfro_PLrejabojadruga zecz ktora maja ukazywac powyrzesz przyklady to tzw. dziedziczenie21:34jabojana pierwszy rzut oka definicja zle(rzecz) wyglada jak przekazanie zmiennejjabojajest to jednak definicja klasy dziedziczacej z klasy rzeczjabojadla przykladu stworzmy wiec obiekt klasy krzeslo:jabojak=krzeslo()jabojarzecz21:35jabojakonstruktor wywolal bowiem metode z klasy z ktorej dziedziczymyjabojaoczywiscie jesli chcemy mozemy zdefiniowac metode o tej samej nazwie wtedy konstruktor by wywolal ja21:36jaboja(wszystkie metody w Pythonie sa wirtualne, w przeciwienstwie do c++)jabojamozna ta ceche wykorzystac nastepujaco:21:37jabojaclass a:jabojadef m(self):jabojareturn 1jabojaclass b:jabojadef m(self):jabojareturn 2jabojadef 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 interpretowanymjabojai wazne jest tylko zeby mialy ta sama nazwe21:40jabojamozna w ten sposob dziedziczac dodawac do klas potomnych nowe funkcjonalnosci, z ktorych beda kozystac klasy bazowe "nie wiedzac" nawet o tym21: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:42jabojadobranocj00ruhehe

Wyszukiwarka