02 септември 2008

Първи стъпки в програмирането с Python. част 8. Нещата от живота

Index:
1.Интродукция
2.В началото бе словото
3.Ю толкинг ту ми?
4.Ужаст и страхопаника
5.Императорът и дракона
6. Драконът и Императора
7.Писна ми да измислям тъпи имена


8. Нещата от живота

Стигнахме до последната част от каквото и да е това което го пиша. Днес ще говорим за нещата. Какво е едно нещо? Ами това е нещо което има някакви свойства, може да правиш нещо с него, и понякога то самото може да прави нещо. Какво е свойство? Това е също нещо, свойствата също имат свойства, може да правиш неща със свойствата и понякога те самите могат да правят неща, А какво е "Способността на нещото да прави" нещо? също е нещо, също има някакви свойства и също може да правиш нещо с тази способност на нещата. Обърках ли ви? Това е обектно ориентираното програмиране: Най лесния начин да си заслужиш боя, като напишеш програма, 80% от която е ненужна архитектура и изпълнява просто административна функция. Кой ще те бие ли? Всеки който има нещастието да работи с теб някой ден :D До тук с абстракциите.(чети от тук на татък почвам с истинските абстракции, а не абстракции на абстракциите)

В обектно ориентираното програмиране най основния елемент е така наречения клас. Класовете са един вид описание на нещата, на обектите. В python на теория всичко е обект, защо само на теория? Няма да ви обяснявам, вече сте достатъчно объркани. Обектите имат свойства, които в някой езици се наричат точно така, "свойства" или properties, в python обаче им викаме атрибути, т.е. нещо което принадлежи на обекта. Обектите с които можеш да правиш нещо с класовете, и способността им да правят те самите нещо се наричат методи. Вече разглеждахме тези неща, методът е подобно на функция нещо, което се съдържа в класа и или променя самия клас, или извършва някакво действие в зависимост от класа. Да разгледаме един клас:

class classs:
i=1222
def pp(self):
return self.i


Този клас на име classs има един атрибут и един метод, атрибутът i е равен на 1222, а методът му pp връща този атрибут. Методът се дефинира също като функция, само че първия аргумент е self. Няма да разберете self ако го обясня точно сега, ще ви стане ясно след момент. Класът е просто описание на нещо, той обяснява как нещо работи, какво има в това нещо и как се казва класът от такива неща(от там идва и името на конструкцията). За да имаме наистина нещо с което можем да работим трябва да го създадем, използвайки класът като негово описание. Това е по просто от колкото може да си представите:

>>>x=classs()
>>>x.i
1222
>>>x.pp()
1222

Действието от първия ред се нарича инстанциране, т.е. създаваме обекта тип classs. Сега х е обект и има атрибут i и метод pp() до които имаме достъп. както виждате от горния пример. Сега е времето да обясна self. Това е нещо като псевдоним за името на инстанцията. Методът pp() трябва да ръвне като стойност един от атрибутите на x, но понеже това е само описание на обекта, а не истинския обект, не знаем как ще се казва той, за това първия аргумент на методите винаги е self, за да имаме достъп до имената в обекта(в случая това е x но е същата файдата като sluchainoimenaobect, все ти трябва self). Това self дразни много хора, разбира се на мен не ми пука, защото не пиша много обектно ориентиран код, и ако мога го избягвам(невъзможна задача понякога, или поне непрактична).

Вече ви обяснявах за средите и за пространствата от имена, класовете в своята същност са точно това: среди с имена. В тях се съдържат имената и дефинициите на методите и атрибутите, единствената разлика е че сега е в отделно пространство от имена, както при функциите, ако си спомняте, там всяка променлива е локална, вътре във функцията, тук тези променливи са локални вътре в обектът. Достъп до тези имена имаме чрез точката x.i означава "дай ми i, който е от пространството x" Без значение дали е от клас, или модул. Не съм обяснявал модулите, но на кратко това са файловете с .py на края, в които си пишете кодът, те са модули, и също са пространства от имена, като класовете и също съдържат имена и променливи(тези които вие пишете). Всъщност класовете и модулите са на теория почти едно и също нещо, контейнер с имена и функции. Може дори да слагате вътрешни класове в класовете си, те са един вид отделни програми(или поне така може ад мислите за тях). Не знам тук какво успяхте да разберете от това обяснение, но когато аз учех тези идеи не ми беше лесно. Не случайно ви обърках в началото, защото наистина е объркващо. Веднъж схванете ли простите концепции обаче, ще разберете че обектно ориентираното програмиране в същността си е тривиално. Поради тази причина и е доста често експлоатирано по нехуманни начини, но в повечето случаи лош обектно ориентиран код не означава катастрофа, а по скоро купчина неприятности, които просто се трупат, и не могат да навредят докато не се натрупат МНОГО. Убунту има 46433(правилно сте прочели) бъгове, и това са само отворените, има около 21342 непотвърдени, и от всички тези само 28 са критични, трябва да благодарим на обектно ориентираното програмиране, където бъговете са трудно доловими и лесни за постигане, с достатъчно невнимание. За да не е сухо съвсем вашето дърво със знание, да го напоим още малко, със знание за наследяването. Да речем че имате един тип нещо, и искате да имате друг тип нещо, който е като другото, но по раклично, да речем, имате клас голф, и друг клас мерцедес, те са общо взето същите, само че мерцедесът има друга цена :D, може да създадем един клас car и два субкласа golf и merc:

class car:
type="automobile"
country="Germany"
def action(self):
print "moveing"

c=car()
>>> c.type
'automobile'
>>> c.country
'Germany'
>>> c.action()
moveing
class golf(car):
def action(self):
print "moveing loud"

>>> g=golf()
>>> g.action()
moveing loud
>>> g.type
'automobile'
>>> g.country
'Germany'
class mercedes(car):
def action(self):
print "moveing with style, bitch"

>>> m=mercedes()
>>> m.action()
moveing with style, bitch

class golf3(golf):
def action(self):
print "chalga, bitch!"

>>> g3=golf3()
>>> g3.action()
chalga, bitch!
>>>

Да видим какво разбрахме от тук, мерцедес и golf са коли, те са от германия и са тип автомобил, също така колата се движи, голфа се движи шумно, а мерцедесът със стил, имаме и golf3 който е тип голф, който освен шумно се движи и с чалга! Виждате добре синтаксисът и вероятно разбирате че това е умствен модел, за това какво ние разбираме под нещо, което съществува. Можем да си мислим колкото си искаме, за компютърът този модел е само пространство от имена, със методи и атрибути, които ние може да наричаме така, но те са просто променливи и функции. Става въпрос за мислене, ние възприемаме света като изгладен от тези неща които съществуват, а в програмирането работим със абстрактни концепции, които не съществуват извън нашите глави и в представата на компютъра за нашето разбиране. Всичко което използвате като софтуер, е просто метафора, за инструмент, нещо което ползвате за да постигнете нещо. И ето с какво ни оставя обектно ориентираното програмиране на края:

С много мощен инструмент за моделиране на обекти от истинския свят, система за абстракция, която може да се използва по много гъвкави начини, както и много прост синтаксис, бихте се съгласили с мен че класовете имат по прост синтаксис от изразите генератори, да речем. Също така имаме начин да създаваме свои инструменти за работа в самия език, можете да напишете своя версия на списъкът, който да им само 10 елемента, а не безкраен брой, знаков низ, който да може да се променя на място, и да не е непроменяем, както е сега в езикът. Разбирате за каква мощ говорим нали? Обектноориентираното програмиране е инструмент, но трябва да сте мъдри с него, той не всемогъщ и всезнаещ и всеможещ, и лесно може да се увлечете в програмистка авантюра и да произведете код, който буквално прилича на спагети.


Изход: Това беше последната част от тази поредица за python, имам план да я вкарам в едно лесно pdf-че и може би да поразширя съдържанието и да оправя някой гафове в другите части, така че да става за четене, също така ще има и други поредици, python е единствения език за който мога да блогвам, този наръчник едва ли ще е много полезен за всеки, той е върхът на върхът на върхът на айсберга, но python е толкова прост, и толкова прозрачен, че под водата няма много айсберг, така че ако подхванете сериозно езика, едва ли ще бъдете изненадани прекалено много от него. От тук не можете да научите езика, идеята беше да направя нещо като въведение, така че ако някой се интересува от езика, да го изгоня с правописните си грешки и лош стил на писане, и ако наистина е мераклия да го накарам да търси другаде материали и да се научи добре на езика. Python е лесен и забавен език, писането на това беше забавно, дори никой да не го харесва, пак беше забавно и се накефих, също така открих колко скапан е blogger редактора за писане на код в него и форматирането му правилно. Майната му, pdf-а ще си има и оцветяване и всичко :D Майната му на html!

Няма коментари: