Пи­тон, де­вуш­ки, и объ­ект­но-ори­ен­ти­ро­ван­ное про­грам­ми­ро­ва­ние

Бу­ра­ти­но (о по­ли­мор­физ­ме):
— Те­бя как зо­вут?
— Маль­ви­на!
— Мы не в сау­не! В жиз­ни те­бя как зо­вут?!
— Ма­ри­на...

Ду­маю, все мы так или ина­че слы­ша­ли об объ­ект­но-ори­ен­ти­ро­ван­ном про­грам­ми­ро­ва­нии. Эта за­мет­ка для тех, кто за 15 ми­нут хо­чет по­нять, что это та­кое. На про­стом при­ме­ре я про­де­мон­стри­рую по­ня­тия класс, объ­ект, кон­ст­рук­тор, де­ст­рук­тор, ин­кап­су­ля­ция, и да­же ска­жу па­ру слов про та­кие слож­ные ве­щи, как на­сле­до­ва­ние и по­ли­мор­физм.

Для экс­пе­ри­мен­тов мы бу­дем ис­поль­зо­вать ин­тер­пре­ти­руе­мый язык про­грам­ми­ро­ва­ния Python, ко­то­рый мож­но ска­чать от­сю­да (я ис­поль­зо­вал вер­сию 2.5.4).

По­сле уста­нов­ки Пи­то­на со­здай­те пу­стой файл test.py, на­жми­те на не­го пра­вой кноп­кой мы­ши (бу­дем пред­по­ла­гать, что вы ис­поль­зу­е­те Windows), и вы­бе­ри­те пункт ме­ню «Edit with IDLE». От­кро­ют­ся два ок­на. Ок­но «Python Shell» мо­же­те за­крыть, а в остав­шее­ся ок­но вставь­те сле­дую­щий текст, и со­хра­ни­те файл:

# -*- coding: cp1251 -*-
class girl:
    methods = {'и':'у','й':'ю','ти':'щу','ей':'ью','ри':'рю',
               'ери':'еру','ети':'ечу','ись':'усь','йся':'юсь',
               'оди':'ожу','рай':'раю','вись':'вюсь','тись':'чусь'}
    def __init__(self, name = 'Наташа'):
        print 'Привет, меня зовут', name
        self.name = name
    def __del__(self):
        print 'Прощай'
    def __getattr__(self, m):
        for l in xrange( len(m) ):
            try:
                print m[:l] + girl.methods[ m[l:] ]
                return
            except KeyError: pass
        if m[0] != '_': print 'Я не умею это делать'

Ли­стинг 1. Реа­ли­за­ция клас­са girl на язы­ке про­грам­ми­ро­ва­ния Python

Эта про­грам­ма — опи­са­ние клас­са girl (де­вуш­ка). Класс — это не­ко­то­рая аб­стракт­ная сущ­ность, ко­то­рая опи­сы­ва­ет всё то об­щее, что бу­дут иметь объ­ек­ты это­го клас­са. На­при­мер, су­ще­ству­ют де­вуш­ки Ма­ша, На­та­ша, Све­та, и дру­гие, но при опре­де­лён­ных об­сто­я­тель­ствах вам со­вер­шен­но не важ­но знать имя де­вуш­ки и дру­гие её свой­ства: до­ста­точ­но то­го, что этот объ­ект — де­вуш­ка, и она мо­жет де­лать всё то, что мо­гут де­лать де­вуш­ки. Это и есть ос­нов­ная идея объ­ект­но-ори­ен­ти­ро­ван­но­го про­грам­ми­ро­ва­ния.

Кон­ст­рук­тор и ме­то­ды

Пре­жде чем мы по­дроб­но раз­бе­рём опи­са­ние клас­са, да­вай­те посмот­рим, как он ра­бо­та­ет. На­жми­те F5 и в по­явив­шем­ся ок­не ин­тер­пре­та­то­ра вве­ди­те сле­ду­ю­щую ко­ман­ду по­сле сим­во­лов >>>:

>>> g = girl()
Привет, меня зовут Наташа

Мы толь­ко что со­зда­ли объ­ект клас­са girl, ко­то­рый те­перь хра­нит­ся в пе­ре­мен­ной g (точ­нее, пе­ре­мен­ная g с ним свя­за­на). Этот объ­ект ещё на­зы­ва­ют эк­зем­пля­ром клас­са. Объ­ект име­ет свой­ства и ме­то­ды. Свой­ства — эта та ин­фор­ма­ция, ко­то­рая хра­нит­ся в объ­ек­те. Ме­то­ды — это те дей­ствия, ко­то­рые мо­жет вы­пол­нять объ­ект (при вы­пол­не­нии ме­то­дов обыч­но ис­поль­зу­ют­ся и мо­дифи­ци­ру­ют­ся свой­ства объ­ек­та). Обыч­но все объ­ек­ты од­но­го клас­са об­ла­да­ют од­ни­ми и те­ми же на­бо­ра­ми ме­то­дов и свойств, но раз­лич­ны­ми зна­че­ни­я­ми этих свойств.

Кон­ст­рук­тор — тот ме­тод, ко­то­рый ав­то­ма­ти­че­ски вы­пол­ня­ет­ся в мо­мент со­зда­ния объ­ек­та. В дан­ном слу­чае де­вуш­ка в мо­мент со­зда­ния по­при­вет­ство­ва­ла нас и на­зва­ла своё имя. В Python кон­ст­рук­тор име­ет имя __init__.

В объ­ект­но-ори­ен­ти­ро­ван­ных язы­ках про­грам­ми­ро­ва­ния на­зва­ния свойств и ме­то­дов обыч­но за­пи­сы­ва­ют­ся че­рез точ­ку по­сле то­го объ­ек­та, к ко­то­ро­му они от­но­сят­ся. Посмот­рим, ка­кие ме­то­ды име­ет на­ша де­вуш­ка:

>>> g.подходи
подхожу
>>> g.раздевайся
раздеваюсь
>>> g.соси
сосу
>>> g.ложись
ложусь
>>> g.раздвигай
раздвигаю
>>> g.переворачивайся
переворачиваюсь
>>> g.одевайся
одеваюсь

Не­пло­хой на­бор ме­то­дов для клас­са girl! Ка­жет­ся, что на­ша де­вуш­ка мо­жет де­лать всё, что угод­но, но на са­мом де­ле это не так:

>>> g.упячка
Я не умею это делать

Де­ст­рук­тор и сбор­щик му­со­ра

По­сле то­го, как де­вуш­ка нам боль­ше не нуж­на, мы мо­жем уда­лить её:

>>> del g
Прощай

То, что мы ви­дим, на­зы­ва­ет­ся де­ст­рук­то­ром — это тот ме­тод, ко­то­рый ав­то­ма­ти­че­ски вы­пол­ня­ет­ся при уда­ле­нии объ­ек­та. В Python де­ст­рук­тор име­ет имя __del__.

Здесь есть не­боль­шая тон­кость: объ­ект на са­мом де­ле уда­ля­ет­ся не по ко­ман­де del, а чуть поз­же: во вре­мя сбор­ки му­со­ра. Ко­ман­дой del мы каг­бэ го­во­рим, что объ­ект g нам боль­ше не ну­жен. А сбор­щик му­со­ра уда­лит объ­ект то­гда, ко­гда он боль­ше не бу­дет ну­жен ни­где.

Про­ве­рим это. До­пу­стим, у вас с дру­гом од­на де­вуш­ка на дво­их, од­на­ко вы об­ща­е­тесь с ней че­рез раз­ные пе­ре­мен­ные (p и j):

>>> p = girl()
Привет, меня зовут Наташа
>>> j = p
>>> j.тяни
тяну
>>> p.толкай
толкаю
>>> del j
>>> del p
Прощай

Об­ра­ти­те вни­ма­ние, что сбор­щик му­со­ра уда­лил де­вуш­ку толь­ко то­гда, ко­гда она не ста­ла боль­ше нуж­на ни как p, ни как j.

Утеч­ка па­мя­ти

Ино­гда бы­ва­ет так, что сбор­щик му­со­ра не мо­жет уда­лить не­нуж­ных де­ву­шек. Рас­смот­рим си­ту­а­цию, ко­гда у вас есть две де­вуш­ки, и они вдруг по­лю­би­ли друг дру­га:

>>> g1 = girl('Маша')
Привет, меня зовут Маша
>>> g2 = girl('Марина')
Привет, меня зовут Марина
>>> g1.танцуй
танцую
>>> g2.раздевайся
раздеваюсь
>>> g1.love = g2
>>> g2.love = g1
>>> del g1
>>> del g2
>>>

Де­вуш­ки не уда­ли­лись, хо­тя ни од­на из них вам боль­ше не нуж­на (вы вы­пол­ни­ли для обе­их ко­ман­ду del). Про­бле­ма здесь в том, что де­вуш­ки нуж­ны друг дру­гу, по­это­му сбор­щик му­со­ра не уда­лил ни од­ну из них (это на­зы­ва­ет­ся коль­це­вой за­ви­си­мо­стью). По­сле вы­пол­не­ния ко­манд del у вас боль­ше нет пе­ре­мен­ных g1 и g2, по­это­му вы бо­лее не име­е­те ни­ка­кой воз­мож­но­сти свя­зать­ся с де­вуш­ка­ми. Од­на­ко, они всё ещё за­ни­ма­ют опе­ра­тив­ную па­мять. Ес­ли де­вуш­ки вам нуж­ны ча­сто, то из-за по­доб­ных си­ту­а­ций па́ры (или да­же трой­ки) де­ву­шек ра­но или позд­но зай­мут всё сво­бод­ное про­стран­ство, и про­грам­ма ава­рий­но за­вер­шит­ся. По этой же при­чи­не со­вре­мен­ные слож­ные про­грам­мы (на­при­мер, опе­ра­ци­он­ные си­сте­мы) при­хо­дит­ся ино­гда пе­ре­за­гру­жать, что­бы вос­ста­но­вить их ра­бо­то­спо­соб­ность.

Ин­кап­су­ля­ция и свой­ства

Те­перь по­го­во­рим об ин­кап­су­ля­ции. Этот тер­мин озна­ча­ет, что вы об­ща­е­тесь с де­вуш­кой как с це­лост­ной сущ­но­стью, и вам не важ­но, как она устрое­на внут­ри. Её дан­ные скры­ты от вас. Со­зда­дим двух де­ву­шек:

>>> g1 = girl('Маша')
Привет, меня зовут Маша
>>> g2 = girl('Наташа')
Привет, меня зовут Наташа
>>> g1.пей
пью
>>> g2.пей
пью

Вро­де бы обе де­вуш­ки со­вер­шен­но оди­на­ко­вы: мож­но вы­зы­вать для обе­их од­ни и те же ме­то­ды. И всё же это раз­лич­ные де­вуш­ки. У них есть свой­ства (в на­шем слу­чае — име­на). К со­жа­ле­нию, мы не мо­жем узнать эти име­на без на­ру­ше­ния ин­кап­су­ля­ции, ибо де­вуш­ки не со­дер­жат ме­то­дов для то­го, что­бы со­об­щить своё имя. По­это­му об­ра­тим­ся к име­нам на­пря­мую, без ве­до­ма де­ву­шек:

>>> print g1.name
Маша
>>> print g2.name
Наташа
>>>

Ко­гда вы хра­ни­те де­ву­шек или пе­ре­да­ё­те их для об­ра­бот­ки в ка­кую-ни­будь функ­цию, вам не на­до бес­по­ко­ить­ся, и хра­нить вме­сте с де­вуш­ка­ми их име­на или пе­ре­да­вать име­на вме­сте с ни­ми: име­на хра­нят­ся внут­ри де­ву­шек, в це­ло­сти и со­хран­но­сти.

На­сле­до­ва­ние

На­сле­до­ва­ние при­ме­ня­ет­ся для то­го, что­бы со­здать бо­лее кон­крет­ный класс из бо­лее об­ще­го. Рас­смот­рим при­мер. До­пу­стим, нам нуж­на ку­хар­ка. Ку­хар­ка — это то­же де­вуш­ка, толь­ко по­ми­мо все­го осталь­но­го она уме­ет го­то­вить. Так и на­пи­шем (до­бавь­те эти стро­ки в ваш файл test.py и со­хра­ни­те):

class cook(girl):
    methods = girl.methods
    methods['готовь'] = 'Кушайте, пожалуйста!'

Те­перь на­жми­те F5 и ис­пы­тай­те ку­хар­ку:

>>> c = cook()
Привет, меня зовут Наташа
>>> c.готовь
Кушайте, пожалуйста!

Об­ра­ти­те вни­ма­ние, что, как и лю­бая де­вуш­ка, ку­хар­ка по­при­вет­ство­ва­ла нас при со­зда­нии. На­сле­до­ва­ние хо­ро­шо тем, что вы все­гда мо­же­те ис­поль­зо­вать ку­хар­ку, как де­вуш­ку:

>>> c.готовь
Кушайте, пожалуйста!
>>> c.раздевайся
раздеваюсь

По­ли­мор­физм

Смысл это­го страш­но­го сло­ва по­яс­ню на при­ме­ре. До­пу­стим, у вас есть не­ко­то­рый класс gril, и вы не зна­е­те, от­ку­да он взял­ся. Вы со­зда­ё­те объ­ект это­го клас­са и ви­ди­те, что он всем по­хож на при­выч­ный нам класс girl, по­это­му вы его ис­поль­зу­е­те со­от­вет­ствен­но:

>>> g = gril()
Привет, меня зовут Эльвира
>>> g.подходи
подхожу
>>> g.соси
сосу

Но, ес­ли вы на­ру­ша­е­те ин­кап­су­ля­цию, про­ис­хо­дит нечто стран­ное:

>>> print g.name
Вася

Впро­чем, ка­кая раз­ни­ца, ес­ли объ­ект де­ла­ет всё то, что вам от не­го нуж­но...

90 отзывов на запись «Пи­тон, де­вуш­ки, и объ­ект­но-ори­ен­ти­ро­ван­ное про­грам­ми­ро­ва­ние»

По­сле g.со­си слож­но со­сре­до­то­чит­ся на ин­кап­су­ля­ции и осо­бен­но­стях сбор­ки му­со­ра
Впро­чем, ка­кая раз­ни­ца, ес­ли объ­ект де­ла­ет всё то, что вам от не­го нуж­но
Слу­чаи, ко­гда Ва­си де­ла­ют всё то, что вам нуж­но, в ди­на­ми­че­ском про­грам­ми­ро­ва­нии на­зы­ва­ют­ся ути­ным ти­пи­ро­ва­ни­ем:
If it looks like a duck and quacks like a duck, it must be a duck
Очень по­нра­ви­лось, ил­лю­стра­тив­но до пре­де­ла. Жаль, что из-за бли­зо­сти к это­му са­мо­му пре­де­лу, эти ил­лю­стра­ции нель­зя бу­дет ис­поль­зо­вать в учеб­ном про­цес­се
Есть не­точ­ность: ин­кап­су­ля­ция — это объ­еди­не­ние дан­ных и ко­да, ра­бо­таю­ще­го с эти­ми дан­ны­ми, в еди­ную сущ­ность.
Ну, во-пер­вых, у ме­ня при­мер­но так и на­пи­са­но:
Этот тер­мин озна­ча­ет, что вы об­ща­е­тесь с де­вуш­кой как с це­лост­ной сущ­но­стью, и вам не важ­но, как она устрое­на внут­ри.
Под «об­ще­ни­ем» я по­ни­мал вы­зов ме­то­дов и ра­бо­ту со свой­ства­ми. А во-вто­рых, со­глас­но Ви­ки­пе­дии,
Инкапсуля́ция — свой­ство язы­ка про­грам­ми­ро­ва­ния, поз­во­ляю­щее объ­еди­нить дан­ные и код в объ­ект и скрыть реа­ли­за­цию объ­ек­та от поль­зо­ва­те­ля.
По­это­му у ме­ня есть при­пис­ка:
Её дан­ные скры­ты от вас.
Хо­тя сле­ду­ет при­знать, что в Пи­то­не не­воз­мож­но пол­но­стью скрыть свой­ства объ­ек­та.
Вот уж по­нят­но так по­нят­но объ­яс­нил!! )
Я прям си­дел и ржал как конь, осо­зна­вая, что я всё по­ни­маю )
И пред­став­лял, что ав­тор, на­вер­ня­ка, сам ржал, ко­гда пи­сал.. Осо­бен­но, вот эти строч­ки:
Ко­гда вы хра­ни­те де­ву­шек или пе­ре­да­ё­те их для об­ра­бот­ки в ка­кую-ни­будь функ­цию
Жаль, толь­ко про по­ли­мор­физм нифи­га­шеч­ки не по­нят­но Кста­ти, а чем на­ве­ян пост? Кто-то по­про­сил?
Из­ви­ни­те за на­зой­ли­вость, а бу­дет ли ещё ка­кой-ли­бо не­про­стой ма­те­ри­ал, осо­бен­но в Ва­шем ис­пол­не­нии, по­доб­но это­му? )
Ес­ли вдруг пой­дё­те на урл мо­е­го сай­та и там уви­ди­те лин­ко­по­мой­ку на­вер­ху, и пор­но в ссыл­ках — не пу­гай­тесь — это лишь жал­кие по­пыт­ки мо­не­ти­зи­ро­вать блог на пи­во
Пост на­ве­ян слу­чай­но­стью. Я де­лал тек­сто­вый об­ра­бот­чик на ос­но­ве пат­тер­нов для ге­не­ра­ции тек­сто­вых пред­став­ле­ний чи­сел и скло­не­ния за­ви­си­мо­го сло­ва (на­при­мер 1234+сту­дент = «Ты­ся­ча две­сти трид­цать че­ты­ре сту­ден­та»), и вдруг по­лу­чи­лась впол­не не­пло­хая сме­на окон­ча­ния (иди-иду, бе­ги-бе­гу, и т.п.). Вот мысль и ста­ла раз­ви­вать­ся. Так как это слу­чай­ность, то ни­че­го но­во­го по­доб­но­го ти­па не пред­ви­дит­ся
Класс­ная шту­ка! С окон­ча­ни­я­ми по­нра­ви­лось. Вот ес­ли бы еще бы­ли на С и на Дел­фи дуб­ли­ка­ты, бы­ло бы про­сто за­ме­ча­тель­но! (С пи­то­ном ни­ко­гда не ра­бо­тал )
аффф­тар жжет
Спа­си­бо за псто! УГ по­вер­же­но ри­аль­не!
Вот так и рас­ска­зы­вай же­не что за­дер­жал­ся на ра­бо­те до 10, по­то­му что про­грам­ми­ро­вал….
Так по­сле та­ких по­стов ведь и не по­ве­рит!
Мо­жет хоть кто-ни­будь в ру­не­те на­пи­сать не смеш­ной, не пош­лый, не про де­ву­шек пост ко­то­рый бы до­ход­чи­во ил­лю­стри­ро­вал тя­го­ты и слож­но­сти ра­бо­ты с ком­пью­те­ром?
су­пер)))))
над ко­ман­да­ми дол­го сме­ял­ся))
ав­тор мо­ло­дец))
Ав­то­ру ми­нус за по­ли­мор­физм и на­сле­до­ва­ние!
Ста­тья пол­но­стью по Фрей­ду) — но за­чем так пре­не­бре­жи­тель­но от­но­сит­ся к жен­ско­му по­лу.
На­вер­ное имен­но по это­му у мно­гих де­ву­ше­ек сте­рео­тип­ное не­га­тив­ное мне­ние о про­грам­ми­стах!
Мо­гу сде­лать вы­вод, что у ав­то­ра не­ла­ды с лич­ной жиз­нью, да и пред­ме­том соб­ствен­но то­же не шиб­ко вла­де­ет!

Ну по­че­му же?

Ав­тор уже 4 го­да, как же­нат, и впол­не счаст­лив:

Моя же­на
ду­маю, ес­ли на­пи­сать то же, но про му­жи­ков — под­хо­жи- на­гнись — жо­пу раз­дви­гай, то уже счаст­ли­вы бу­де­те не так силь­но. Ну вот не мо­гут лю­ди по­нять, как это жен­щи­нам не­при­ят­но чи­тать, эм­па­тия на ну­ле. За­то на пи­то­не про­грам­ми­ру­ет, да…
Ан­тон, мо­ло­дец!
Ста­тья — блеск! Ува­жаю мно­го­уров­не­вость в со­чи­не­ни­ях, ко­гда и для ума, и для ду­ши, и для чи­ста­поржать то­же оста­ет­ся))))) Успе­хов!
Не пло­хо
За­бав­но, очень ил­лю­стра­тив­но.
Од­на­ко вер­но ска­за­но ввер­ху — при­мер про по­ли­мор­физм в це­лом не­пра­виль­ный, это де­мон­стра­ция ducktyping. При­мер по­ли­мор­физ­ма это пе­ре­опре­де­ле­ние ме­то­да «го­товь» в клас­се cook, или что то око­ло то­го.

Скрипт для Python 3, мо­жет ко­му по­на­до­бит­ся :)

# -*- coding: cp1251 -*-
class girl:
     methods = {'и':'у','й':'ю','ти':'щу','ей':'ью','ри':'рю',
                'ери':'еру','ети':'ечу','ись':'усь','йся':'юсь',
                'оди':'ожу','рай':'раю','вись':'вюсь','тись':'чусь'}
     def start(name = "Маша"):
         print ("Привет, меня зовут", name)
     def __del__(self):
         print ("Прощай")
     def __getattr__(self, m):
         for l in range( len(m) ):
             try:
                 print (m[:l] + girl.methods[ m[l:] ])
                 return
             except KeyError: pass
         if m[0] !='_': print ("Я не умею это делать")
     start()
g=girl()
Спа­си­бо.
Я бы не­мно­го пе­ре­пи­сал… class Girl:
methods = {‘и’: ‘у’, ‘й’: ‘ю’, ‘ти’: ‘щу’, ‘ей’: ‘ью’, ‘ри’: ‘рю’,
‘ери’: ‘еру’, ‘ети’: ‘ечу’, ‘ись’: ‘усь’, ‘йся’: ‘юсь’,
‘оди’: ‘ожу’, ‘рай’: ‘раю’, ‘вись’: ‘вюсь’, ‘тись’: ‘чусь’} def __init__(self, name=»Ма­ша»):
print(«При­вет, ме­ня зо­вут», name) def __del__(self):
print(«Про­щай») def __getattr__(self, m):
for l in range(len(m)):
try:
print(m[:l] + Girl.methods[m[l:]])
return
except KeyError:
pass
if m[0] != ‘_’:
print(«Я не умею это де­лать»)

class Girl:
methods = {\'и\': \'у\', \'й\': \'ю\', \'ти\': \'щу\', \'ей\': \'ью\', \'ри\': \'рю\',
\'ери\': \'еру\', \'ети\': \'ечу\', \'ись\': \'усь\', \'йся\': \'юсь\',
\'оди\': \'ожу\', \'рай\': \'раю\', \'вись\': \'вюсь\', \'тись\': \'чусь\'} def __init__(self, name=\"Ма­ша\"):
print(\"При­вет, ме­ня зо­вут\", name) def __del__(self):
print(\"Про­щай\") def __getattr__(self, m):
for l in range(len(m)):
try:
print(m[:l] + Girl.methods[m[l:]])
return
except KeyError:
pass
if m[0] != \'_\':
print(\"Я не умею это де­лать\")
class Girl:
    methods = {‘и’: ‘у’, ‘й’: ‘ю’, ‘ти’: ‘щу’, ‘ей’: ‘ью’, ‘ри’: ‘рю’,
               ‘ери’: ‘еру’, ‘ети’: ‘ечу’, ‘ись’: ‘усь’, ‘йся’: ‘юсь’,
               ‘оди’: ‘ожу’, ‘рай’: ‘раю’, ‘вись’: ‘вюсь’, ‘тись’: ‘чусь’}     def __init__(self, name="Маша"):
        print("Привет, меня зовут", name)     def __del__(self):
        print("Прощай")     def __getattr__(self, m):
        for l in range(len(m)):
            try:
                print(m[:l] + Girl.methods[m[l:]])
                return
            except KeyError:
                pass
        if m[0] != ‘_’:
            print("Я не умею это делать")
 
Ста­тья ши­кар­ная! Сра­зу всё по­нял. По­че­му в шко­ле так не объ­яс­ня­ют?
>>> p = girl ()
При­вет, ме­ня зо­вут На­та­ша
>>> p. под­хо­ди
SyntaxError: invalid syntax Это при ко­ди­ров­ке cp1251
При ко­ди­ров­ке utf-8 то же са­мое.
В чем пе­рец?
Функ­цио­ни­ро­ва­ние это­го при­ме­ра ос­но­ва­но на глю­ке в ста­рых вер­си­ях Idle (ре­дак­тор для Пи­то­на), поз­во­ляв­шем ис­поль­зо­вать рус­ские бук­вы в име­нах ме­то­дов (при­чём толь­ко в ко­ди­ров­ке cp1251). Я сей­час по­ты­кал­ся в раз­ные вер­сии Пи­то­на; по­след­няя вер­сия, в ко­то­рой ра­бо­та­ет при­мер, — 2.6.6. Вот ссыл­ка: http://www.python.org/download/releases/2.6.6/ (я про­ве­рял на 32-х бит­ной сбор­ке).
До­бро­го вре­ме­ни су­ток) Спа­си­бо за ста­тью. Очень по­нят­но на­пи­са­но. Я как раз пи­шу адап­тер. Так как пи­тон ви­жу во­об­ще пер­вый раз, то до­ста­точ­но слож­но, а зна­ний ооп во­об­ще не хва­та­ет.

Юни­код вер­сия

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys

class girl:
    dic = {'и':'у','й':'ю','ти':'щу','ей':'ью','ри':'рю',
           'ери':'еру','ети':'ечу','ись':'усь','йся':'юсь',
           'оди':'ожу','рай':'раю','вись':'вюсь','тись':'чусь'}
    udic = dict([(k.decode('utf-8'), v.decode('utf-8')) for k, v in dic.items()])
   
    def __init__(self, name = 'Наташа'):
        print u'Привет, меня зовут', name.decode('utf-8')
        self.name = name.decode('utf-8')
    def __del__(self):
        print u'Прощай'
    def do(self, m):
        m = m.decode('utf-8')
        for key in self.udic.keys():
            if m[-len(key):] == key:
                print ''.join([m[:-len(key)],self.udic[key]]).encode(sys.stdout.encoding)
                return
        print u'Я не умею это делать'

g = girl('Алинка')
g.do('раздевайся')
g.do('соси')
g.do('раздвигай')
g.do('агрегат')
print g.name, u'уходит..'
del g

А вот ра­бо­таю­щая вер­сия для Python3.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys

class Girl(object):
    dic = {'и':'у','й':'ю','ти':'щу','ей':'ью','ри':'рю',
           'ери':'еру','ети':'ечу','ись':'усь','йся':'юсь',
           'оди':'ожу','рай':'раю','вись':'вюсь','тись':'чусь'}
    udic = dict([(k, v) for k, v in dic.items()])
   
    def __init__(self, name = 'Наташа'):
        print(" ".join(['Привет, меня зовут', name]))
        self.name = name
    def __del__(self):
        print('Прощай')
    def __getattr__(self, m):
        for key in self.udic.keys():
            if m[-len(key):] == key:
                print(''.join([m[:-len(key)],self.udic[key]]))
                return
        print('Я не умею это делать')

g = Girl('Алинка')
g.паркуйся
g.программируй
g.улыбайся
g.упражняйся
del g
Вы уве­ре­ны, что ваш код со­от­вет­ству­ет ори­ги­на­лу? Де­ло в том, что нуж­но за­ме­нять окон­ча­ние на са­мое длин­ное из тех, что есть в таб­ли­це, а не на пер­вое по­пав­шее­ся. Рас­смот­рим на­бор из трёх пра­вил, имею­щих­ся в таб­ли­це:
1) и → у
2) ри → рю
3) ери → еру Для че­го нуж­но тре­тье пра­ви­ло, ес­ли есть пер­вое? Для то­го, что­бы в не­ко­то­рых слу­ча­ях пе­ре­кры­вать вто­рое, ко­то­рое ино­гда пе­ре­кры­ва­ет пер­вое. Пра­ви­ла бы­ли по­лу­че­ны ма­шин­ным обу­че­ни­ем на ос­но­ве спис­ка из двух­сот гла­го­лов по­ве­ли­тель­но­го на­кло­не­ния. В тек­сте про­грам­мы пра­ви­ла упо­ря­до­че­ны по убы­ва­нию ча­сто­ты ис­поль­зо­ва­ния. При этом бо­лее длин­ное пра­ви­ло яв­ля­ет­ся ис­клю­че­ни­ем (пе­ре­кры­ва­ет) бо­лее ко­рот­кое.
Во­об­ще класс­ная ста­тья! Сра­зу ста­но­вит­ся все по­нят­но как на­чать про­грам­ми­ро­вать на Python-е, спа­си­бо!
на­ко­нец-то всё по­нял !!!
вы­бе­ри­те пункт ме­ню «Edit with IDLE» — а ес­ли нет та­ко­го пунк­та в нис­па­даю­щем ме­ню мыш­ки?
Hi this is kind of of off topic but I was wondering if blogs use WYSIWYG editors or if you
have to manually code with HTML. I’m starting a
blog soon but have no coding know-how so I wanted to get advice from someone
with experience. Any help would be enormously appreciated!
It is the best time to make some plans for the future
and it is time to be happy. I’ve learn this post
and if I could I wish to recommend you some attention-grabbing
issues or tips. Perhaps you can write next articles relating to
this article. I desire to read even more issues approximately it!
Howdy, i read your blog occasionally and i own a similar one and i was just curious if you get a lot of
spam feedback? If so how do you stop it, any plugin or anything you can suggest? I get so much lately it’s driving me insane so any support is very much appreciated.
I’m pretty pleased to uncover this web site. I want to to thank you for ones time for this particularly fantastic read!!
I definitely liked every little bit of it and I have you book-marked to see new stuff in your blog.
If some one wishes to be updated with most up-to-date technologies afterward
he must be pay a visit this web page and be up to date daily.
Just wish to say your article is as astounding. The clarity in your post is just great and i can assume you’re an expert on this subject.
Well with your permission let me to grab your
RSS feed to keep updated with forthcoming post. Thanks a million and please continue the
gratifying work.
I do not even know the way I finished up here,
but I assumed this publish was once good. I do not recognize who you might be however definitely you’re going to a
famous blogger should you are not already. Cheers!
First off I want to say superb blog! I had a quick question that I’d like to ask if you do not mind. I was interested to know how you center yourself
and clear your head before writing. I have had trouble clearing my thoughts
in getting my ideas out. I do enjoy writing however it just seems like the first
10 to 15 minutes are generally wasted simply just trying to figure out how to begin.
Any suggestions or hints? Thanks!
Greetings I am so happy I found your webpage, I really found you by error, while I was browsing on Aol for
something else, Regardless I am here now and
would just like to say kudos for a remarkable post and
a all round enjoyable blog (I also love the theme/design), I don’t have time to read it all at the minute but I have bookmarked it and also added your RSS feeds, so when I have time I will
be back to read a great deal more, Please do keep up
the superb work.
When I originally commented I clicked the «Notify me when new comments are added»
checkbox and now each time a comment is added I get several emails with the same comment.
Is there any way you can remove people from that service?
Many thanks!
I have read so many articles or reviews about the blogger lovers however this article is genuinely
a fastidious post, keep it up.
you’re really a excellent webmaster. The web site loading pace is amazing.
It sort of feels that you’re doing any distinctive trick.
Also, The contents are masterwork. you’ve performed a fantastic process on this subject!
Hey There. I found your blog using msn. This is a very
well written article. I’ll make sure to bookmark
it and return to read more of your useful info.
Thanks for the post. I will certainly return.
Hi there, all the time i used to check website posts here in the early hours in the daylight, for the reason that
i enjoy to find out more and more.
Your style is unique compared to other people I’ve read stuff from.
I appreciate you for posting when you’ve got the opportunity, Guess I will just bookmark this site.
Greetings! This is my 1st comment here so I just wanted to give a
quick shout out and tell you I truly enjoy reading your posts.
Can you recommend any other blogs/websites/forums that cover the
same topics? Many thanks!
Fantastic beat ! I wish to apprentice even as you amend your site, how
could i subscribe for a weblog web site? The account helped
me a acceptable deal. I have been a little bit acquainted of this your broadcast provided bright transparent concept
Hi, i read your blog from time to time and i own a similar one and i was just
curious if you get a lot of spam remarks? If so
how do you protect against it, any plugin or anything you can advise? I get so much lately it’s driving me crazy so any assistance is very much appreciated.
You’re so interesting! I do not think I’ve truly read through a
single thing like this before. So good to discover another
person with a few genuine thoughts on this issue.
Really.. many thanks for starting this up. This site is one thing that is
required on the internet, someone with some originality!
I just like the valuable information you supply for your articles. I’ll bookmark your blog and test again right here regularly. I am rather sure I’ll be told many new stuff right right here! Good luck for the next!
Wow, wonderful weblog format! How lengthy have you been blogging for?
you make running a blog look easy. The whole glance of
your web site is great, let alone the content!
Outstanding story there. What happened after? Good luck!
Hello There. I discovered your weblog the use of msn. That is a really well written article.
I will be sure to bookmark it and come back to read extra of your useful info. Thanks for the post. I’ll definitely comeback.
naturally like your web site however you have to take a look at the spelling
on quite a few of your posts. Many of them are rife with spelling problems and I to find it
very bothersome to tell the truth however I will certainly come back again.
Amazing! Its truly remarkable paragraph, I have got much clear idea concerning from
this post. Stop by my weblog :: real mink lashes for sale
I blog quite often and I genuinely thank you
for your content. This article has truly peaked my interest.
I’m going to book mark your site and keep checking for new information about once per week.
I subscribed to your Feed as well.
Undeniably imagine that that you said. Your favourite justification appeared to be on the net the easiest
thing to understand of. I say to you, I definitely get irked even as folks think about worries that they
plainly do not recognize about. You controlled to hit the nail upon the top and also defined out the whole thing with no need side-effects , other folks could take a signal.
Will likely be back to get more. Thanks
Thanks for your marvelous posting! I actually enjoyed reading
it, you happen to be a great author.I will be sure to bookmark
your blog and may come back in the future. I want to encourage
continue your great work, have a nice day! Here is my web page: golf swing (Kathy)
I’m gone to tell my little brother, that he should also pay a visit
this webpage on regular basis to get updated from most recent news. Take a look at my blog … madden 17 coins cheap
Hi there! I’m at work surfing around your blog from my new iphone 3gs! Just wanted to say I love reading your blog and look forward to all your posts! Carry on the excellent work! My blog post — mink lash extensions dublin
My developer is trying to convince me to move
to .net from PHP. I have always disliked the idea because
of the costs. But he’s tryiong none the less. I’ve been using
Movable-type on a variety of websites for about a year and am
worried about switching to another platform. I have heard very good
things about blogengine.net. Is there a way I can transfer all
my wordpress posts into it? Any kind of help would be
greatly appreciated! my web-site csgo skins free giveaway
I’m truly enjoying the design and layout of your website.
It’s a very easy on the eyes which makes it much
more pleasant for me to come here and visit more often. Did you hire out a developer to
create your theme? Excellent work!
When I initially commented I clicked the «Notify me when new comments are added» checkbox and now each time a comment is added I get several e-mails with the same comment.
Is there any way you can remove me from that service?
Thanks a lot! Feel free to visit my website: fifa 17 coins ps4 cheapest
I love your blog.. very nice colors & theme. Did you create this website yourself
or did you hire someone to do it for you?
Plz respond as I’m looking to create my own blog and would like to find out
where u got this from. appreciate it Look at my page; cs go skins steam free
Fascinating blog! Is your theme custom made or did you download it from somewhere?
A design like yours with a few simple adjustements would really make my blog stand
out. Please let me know where you got your design. Thanks Also visit my web blog siberian mink lashes for sale
Oh my goodness! Incredible article dude! Thank you so much, However I am encountering difficulties with
your RSS. I don’t understand why I can’t subscribe to it. Is there
anybody else getting similar RSS issues? Anybody who knows the answer will you kindly respond?
Thanx!! my web site … mink eyelash extensions nyc (Edwin)
You really make it seem so easy with your presentation but I find this topic to be actually something that I think I would never understand.
It seems too complex and very broad for me. I am looking forward for your next post, I
will try to get the hang of it! Also visit my homepage: fifa coins 17 buy
Ahaa, its pleasant dialogue on the topic of this piece of writing here at this weblog,
I have read all that, so now me also commenting at this place. Feel free to visit my web-site: csgo skins free download (http://www.iassoft.com/)
Greetings I am so excited I found your blog, I really found you by error, while
I was researching on Bing for something else, Nonetheless I am here now and would just like
to say cheers for a incredible post and a all round enjoyable blog (I also
love the theme/design), I don’t have time to read
it all at the minute but I have saved it and also added in your RSS feeds, so
when I have time I will be back to read much more, Please
do keep up the great work.
I really like what you guys are up too. This type of
clever work and reporting! Keep up the superb works guys I’ve added you guys to my blogroll.
Every weekend i used to pay a visit this web site,
for the reason that i want enjoyment, since this this web site conations genuinely fastidious
funny material too.
For latest news you have to pay a quick visit world wide web and on the
web I found this website as a most excellent
web site for newest updates. Also visit my web blog … mink strip lashes uk
I blog quite often and I really thank you for your content. The article has truly peaked my interest. I’m going to book mark your site and keep checking for new details about once per week. I subscribed to your Feed too. My homepage: fifa coins for sale usa
Wow, this post is fastidious, my sister is analyzing these things, therefore I am going to
inform her. my page: csgo skins free code
I like the helpful info you provide in your articles.
I’ll bookmark your blog and check again here regularly.
I am quite sure I will learn many new stuff right here! Best of luck for the next!
It’s appropriate time to make some plans for
the long run and it’s time to be happy. I have learn this post and if I could I
desire to counsel you some attention-grabbing things or tips.
Maybe you can write subsequent articles referring to this
article. I desire to read even more things about it!
Hi, its nice paragraph concerning media print,
we all understand media is a great source of data.
I am curious to find out what blog platform you’re using? I’m having some small security issues with my latest website and I’d
like to find something more safeguarded. Do you have any solutions?
If some one wishes to be updated with newest technologies therefore he must be go to see this
website and be up to date daily.
Hello, after reading this awesome post i am too glad to share
my know-how here with colleagues.
Wow, awesome blog format! How lengthy have you ever been running
a blog for? you made running a blog glance easy. The whole look of your site is magnificent, as smartly as the content! Also visit my web blog: madden mobile coin glitch no download
I loved as much as you will receive carried out right here.
The sketch is attractive, your authored material stylish.
nonetheless, you command get got an impatience over that you wish be delivering the following. unwell unquestionably come further formerly again as exactly the same
nearly a lot often inside case you shield this increase. Also visit my web-site — cs go skins for money
Currently it appears like WordPress is the preferred blogging platform available right now.
(from what I’ve read) Is that what you’re using on your blog? Check out my website: mink eyelash extensions nyc (http://unicadeck.cafe24.com/xe/ruleFAQ/1403139)
Generally I do not learn post on blogs, however I would
like to say that this write-up very forced me to try and do so!
Your writing style has been amazed me. Thanks, very nice post.
I read this post fully on the topic of the comparison of latest and previous
technologies, it’s amazing article.
Wow, wonderful weblog structure! How long have you ever
been running a blog for? you made blogging look easy. The full glance of your site is magnificent, let alone the content! Here is my web page; madden mobile coins apk
I loved as much as you’ll receive carried out right
here. The sketch is tasteful, your authored subject matter stylish.
nonetheless, you command get got an nervousness over that you wish be delivering the following. unwell unquestionably come further formerly again as
exactly the same nearly very often inside case you shield this increase. Feel free to surf to my site :: mink lash extensions kit
Hello to all, how is the whole thing, I think every
one is getting more from this website, and your views are nice for new visitors. Also visit my site: csgo skins betting sites

Оставить отзыв

Жёлтые поля обязательны к заполнению

   

Можете использовать теги <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang=""> <div class=""> <span class=""> <br>