Уведомления

Группа в Telegram: @pythonsu

#1 Март 2, 2009 00:50:30

tyua
От:
Зарегистрирован: 2009-02-16
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

как разобраться с ООП?

Прошу посоветывать как разораться с ООП в Питоне, да и не только в питоне, а вобще наверное, прочитал все что смог найти в сети по этому на русском,
Объектно-ориентированное программирование на Питоне — Википедия
INTUIT.ru: Курс: Язык программирования ..: Лекция №4: Объектно-ориентированное программирование
Учебник Python 3.1 — Викиучебник
LXF78:Python — Linuxformat
понимание синтаксиса вроде бы есть, но как и где использовать понять не могу, может стои почитать что-то о ооп не именно для питона, а в общем? тогда что посоветуете, или как-то на примерах каких-то с этим разбираться? жду совсета, желательно на русскую литературу, можно украинскую :), т.к. с английским увы не очень. Спасибо.



Офлайн

#2 Март 2, 2009 01:09:51

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

как разобраться с ООП?

Даже знание английского не поможет. ООП это - парадигма. Сам синтаксис тут точно не поможет, нужно понять подход.
В нескольких фразах - если в обычном, процедурном стиле создаются функции, каждая из которых делает определённые операции над данными и выдаёт определённый результат, то в ООП задачу рассматривают не как обработку данных а как взаимодействие объектов, которые эти данные представляют.
Вы не увидите каких-либо очевидных преимуществ ооп перед процедурным программированием, поначалу, но они есть при решении множества задач. Я начал кое-что писать по этому поводу (правда забросил продолжение), прочтите, может станет понятнее.

Отредактировано (Март 2, 2009 01:11:15)

Офлайн

#3 Март 2, 2009 01:24:24

tyua
От:
Зарегистрирован: 2009-02-16
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

как разобраться с ООП?

Ferroman Спасибо! уже начал читать Вашу статью, очень надеюсь что она поможет понять ООП, а вобще на сколько я уже понимаю, с ооп нужно наверное столкнуться в реальной какой-то задаче, и увидеть полезность его, пока в тех задачах что я решал (их было не много, и они были очень маленькие) применить его было просто некуда, но в тоже время все модули библиотеке построены на классах, объектах и т.д. и понять эти классы и т.д. наверное нужно сразу.



Офлайн

#4 Март 2, 2009 01:35:33

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

как разобраться с ООП?

Во! А вот это правильный вопрос. Уважаю.
Что почитать не скажу, так как разбирался я с этим много лет назад ещё на четвёртой дельфе…

Вот есть вещь (объект) стул. Где-то далеко есть чертёж (класс) этого стула. Который, в свою очередь, тоже имеет своё описание, т.е. тоже является объектом…
Наш стул имеет свойства: цвет (деревянный), температура (комнатная) и пр…
А рядом есть объект человек (класс человека описан в ДНК). И у него есть метод “сесть на стул”. В качестве параметра нужно указать объект-стул и можно передать параметры посадки (“плюхнуться всем весом” и “положить правую ногу на левую” (и ни наоборот!)). Ещё существует объект жопа, которая является частью объекта-человека и передаёт объекту-мозгу сведения об удобности посадки…
Так к чему это я? Матрица, сцука, тоже объект, который содежит другие объекты… :-)

Где использовать ООП? Да везде. За исключением каки-нить специфичных задачек (обычно, чисто математических). Просто когда начинаешь придумывать программу, начни с того, что выдели основные её объекты.
Вот пара примеров:
- пакет в сети, обладает адресатом, данными, конторольной суммой (высчитывается прямо в объекте-пакете?)…
- vCard – ФИО, телефон, мыло, джабба, фото, подгружаемое только при первом обращении…
- менеджер базы данных, чтобы не формировать SQL руками, а просто передавать объект-vCard, чтобы добавить его в DB..



Офлайн

#5 Март 2, 2009 01:59:33

tyua
От:
Зарегистрирован: 2009-02-16
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

как разобраться с ООП?

Подход к объяснению ООП который использовал у себя в статье Ferroman и в своем коменте ZZZ мне понравился намного больше чем то что я читал, особенно мне очень не нравилось когда в первых предложениях главы о ооп тебе выдают штук 10 каких-то терминов, и дальше весь текст состоит практически из этих терминов.
ZZZ а очень ли Вас затруднит перевести то что вы написали о стуле, человеке, жопе и т.д. с русского на код питона? как по мне был бы очень наглядный пример.



Офлайн

#6 Март 2, 2009 02:06:48

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

как разобраться с ООП?

tyua
Да нет, задачи все те же что и при процедурном. Вам не обязательно писать что-то огромное, что бы увидеть полезность ООП. Надо писать что-то где много разного по сути но что взаимодействует между собой. Тогда видно что есть общего, а где отличия и как их можно делить на отдельные “наборы” - объекты с свойствами (это те же данные что передавались туда-сюда при процедурном программировании) и методами (собственно сами процедуры) методы работают над данными и позволяют разным объектам взаимодействовать между собой.
Да я знаю что сейчас все мной сказанное как-то не складывается в картинку. А вы попробуйте все что я в этом посте сказал применить к тому что я сказал в статье. Найти общее, и разное…

Отредактировано (Март 2, 2009 02:07:36)

Офлайн

#7 Март 2, 2009 02:50:58

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

как разобраться с ООП?

tyua
ZZZ а очень ли Вас затруднит перевести то что вы написали о стуле, человеке, жопе и т.д. с русского на код питона? как по мне был бы очень наглядный пример.
Хм…
Я сейчас честно попытался, но ничего путного и красивого не получилось. А вот в статье Ferroman'а, в общем-то, очень неплохой пример. Да, на реализм не сильно тянет, но мой пример со стулом ещё меньше… В общем-то я просто постебался и просто хотел сказать, что слово объект применимо не только к стульям, жопам и прочим пылесосам, но и к струкрурам данных. Как у объекта-жопы есть метод “пукнуть”, так и у объекта-списка есть метод “sort”… И именно так к этому относиться и надо.



Офлайн

#8 Март 2, 2009 12:18:57

tyua
От:
Зарегистрирован: 2009-02-16
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

как разобраться с ООП?

Тогда хочу задать еще один вопрос, на конкретном примере.
Есть у меня задачка, нужно забирать почту с почтового ящика, смотреть наличие вложения и в зависимости от расширения файла сохранять его в определенный каталог, попутно записывать в лог что мы делаем. Вопрос, что в этом примере можно выделить как объекты и соответственно сделать соответствующий класс, или все таки в этом примере не имеет смысла использовать ооп. Ниже приведу код того как я это сделал естественно без ооп. заодно может укажите где и что я делаю не так.

# -*- coding: UTF-8 -*-

import email, poplib, email.Header, logging
from ConfigParser import ConfigParser
conf = ConfigParser()
conf.read( 'robot.conf' )
LOG_FILENAME = conf.get("Config","LOG_FILENAME")
SERVER = conf.get("Config","SERVER")
USER = conf.get("Config","USER")
PASSWD = conf.get("Config","PASSWD")
dir_ok = conf.get("Config","DIR_OK")
dir_spam = conf.get("Config","DIR_SPAM")
expansion = conf.get("Config","EXPANSION")

logging.basicConfig(filename=LOG_FILENAME,
level=logging.INFO,
datefmt='%a, %d %b %Y %H:%M:%S',
format='%(asctime)s %(message)s',)

def recode(title):
for text, enc in email.Header.decode_header(title):
try:
title= unicode(text, enc)
title= title.encode('UTF8')
return title
except TypeError, x:
print title, 'невозможно перекодировать ..', x
return title
logging.info('Start mailrobot--------------------------------')

p = poplib.POP3(SERVER)
print p.getwelcome()
print p.user(USER)
print p.pass_(PASSWD)
print '---------------------------'

response, lst, octets = p.list()

logging.info(response)
for msgnum, msgsize in [x.split(' ') for x in lst]:
resp, lines, octets = p.retr(msgnum)
msgtxt = '\n'.join(lines) + '\n\n'
msg = email.message_from_string(msgtxt)
subj = recode(msg['subject'])
fro = recode(msg['from'])
to = recode(msg['to'])
logging.info('{0:8s} {1}'.format('From :', fro))
logging.info('{0:8s} {1}'.format('To :', to))
logging.info('{0:8s} {1}'.format('Subj :', subj))
msg_parts = [(part.get_filename(), part.get_payload(decode=True)) for part in msg.walk()]
for part_name, part_file in msg_parts:
attach = recode(part_name)
if part_name != None and attach[-3:] == expansion:
print 'Attach :', attach, '[no spam]'
logging.info('{0:8s} {2} {1}'.format('Attach:', '[no spam]', attach))
f = open(dir_ok + attach, 'wb')
f.write(part_file)
f.close()
elif part_name != None:
print 'Attach:', attach, '[spam]'
logging.info('{0:8s} {2} {1}'.format('Attach :', '[spam]', attach))
f = open(dir_spam + attach, 'wb')
f.write(part_file)
f.close()
p.dele(msgnum)
logging.info('end----------------------------------------end')
p.quit()
logging.info('Stop mailrobot----------------------------------')
print 'stop'



Отредактировано (Март 2, 2009 12:21:31)

Офлайн

#9 Март 2, 2009 13:45:26

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

как разобраться с ООП?

Для понимания концепций ООП лучше всего обратится к истокам. Под истоками я понимаю книгу Бьярна Страуструпа (“Язык программирования С++”). По крайней мере для себя я нашел эту книгу лучшей.
http://wmate.ru/ebooks/book11.html



Офлайн

#10 Март 2, 2009 13:49:05

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

как разобраться с ООП?

Я по ней только обозначения учил, понятнее мне после нее не стало :)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version