Найти - Пользователи
Полная версия: как разобраться с ООП?
Начало » Python для новичков » как разобраться с ООП?
1 2 3
tyua
Прошу посоветывать как разораться с ООП в Питоне, да и не только в питоне, а вобще наверное, прочитал все что смог найти в сети по этому на русском,
Объектно-ориентированное программирование на Питоне — Википедия
INTUIT.ru: Курс: Язык программирования ..: Лекция №4: Объектно-ориентированное программирование
Учебник Python 3.1 — Викиучебник
LXF78:Python — Linuxformat
понимание синтаксиса вроде бы есть, но как и где использовать понять не могу, может стои почитать что-то о ооп не именно для питона, а в общем? тогда что посоветуете, или как-то на примерах каких-то с этим разбираться? жду совсета, желательно на русскую литературу, можно украинскую :), т.к. с английским увы не очень. Спасибо.
Ferroman
Даже знание английского не поможет. ООП это - парадигма. Сам синтаксис тут точно не поможет, нужно понять подход.
В нескольких фразах - если в обычном, процедурном стиле создаются функции, каждая из которых делает определённые операции над данными и выдаёт определённый результат, то в ООП задачу рассматривают не как обработку данных а как взаимодействие объектов, которые эти данные представляют.
Вы не увидите каких-либо очевидных преимуществ ооп перед процедурным программированием, поначалу, но они есть при решении множества задач. Я начал кое-что писать по этому поводу (правда забросил продолжение), прочтите, может станет понятнее.
tyua
Ferroman Спасибо! уже начал читать Вашу статью, очень надеюсь что она поможет понять ООП, а вобще на сколько я уже понимаю, с ооп нужно наверное столкнуться в реальной какой-то задаче, и увидеть полезность его, пока в тех задачах что я решал (их было не много, и они были очень маленькие) применить его было просто некуда, но в тоже время все модули библиотеке построены на классах, объектах и т.д. и понять эти классы и т.д. наверное нужно сразу.
ZZZ
Во! А вот это правильный вопрос. Уважаю.
Что почитать не скажу, так как разбирался я с этим много лет назад ещё на четвёртой дельфе…

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

Где использовать ООП? Да везде. За исключением каки-нить специфичных задачек (обычно, чисто математических). Просто когда начинаешь придумывать программу, начни с того, что выдели основные её объекты.
Вот пара примеров:
- пакет в сети, обладает адресатом, данными, конторольной суммой (высчитывается прямо в объекте-пакете?)…
- vCard – ФИО, телефон, мыло, джабба, фото, подгружаемое только при первом обращении…
- менеджер базы данных, чтобы не формировать SQL руками, а просто передавать объект-vCard, чтобы добавить его в DB..
tyua
Подход к объяснению ООП который использовал у себя в статье Ferroman и в своем коменте ZZZ мне понравился намного больше чем то что я читал, особенно мне очень не нравилось когда в первых предложениях главы о ооп тебе выдают штук 10 каких-то терминов, и дальше весь текст состоит практически из этих терминов.
ZZZ а очень ли Вас затруднит перевести то что вы написали о стуле, человеке, жопе и т.д. с русского на код питона? как по мне был бы очень наглядный пример.
Ferroman
tyua
Да нет, задачи все те же что и при процедурном. Вам не обязательно писать что-то огромное, что бы увидеть полезность ООП. Надо писать что-то где много разного по сути но что взаимодействует между собой. Тогда видно что есть общего, а где отличия и как их можно делить на отдельные “наборы” - объекты с свойствами (это те же данные что передавались туда-сюда при процедурном программировании) и методами (собственно сами процедуры) методы работают над данными и позволяют разным объектам взаимодействовать между собой.
Да я знаю что сейчас все мной сказанное как-то не складывается в картинку. А вы попробуйте все что я в этом посте сказал применить к тому что я сказал в статье. Найти общее, и разное…
ZZZ
tyua
ZZZ а очень ли Вас затруднит перевести то что вы написали о стуле, человеке, жопе и т.д. с русского на код питона? как по мне был бы очень наглядный пример.
Хм…
Я сейчас честно попытался, но ничего путного и красивого не получилось. А вот в статье Ferroman'а, в общем-то, очень неплохой пример. Да, на реализм не сильно тянет, но мой пример со стулом ещё меньше… В общем-то я просто постебался и просто хотел сказать, что слово объект применимо не только к стульям, жопам и прочим пылесосам, но и к струкрурам данных. Как у объекта-жопы есть метод “пукнуть”, так и у объекта-списка есть метод “sort”… И именно так к этому относиться и надо.
tyua
Тогда хочу задать еще один вопрос, на конкретном примере.
Есть у меня задачка, нужно забирать почту с почтового ящика, смотреть наличие вложения и в зависимости от расширения файла сохранять его в определенный каталог, попутно записывать в лог что мы делаем. Вопрос, что в этом примере можно выделить как объекты и соответственно сделать соответствующий класс, или все таки в этом примере не имеет смысла использовать ооп. Ниже приведу код того как я это сделал естественно без ооп. заодно может укажите где и что я делаю не так.

# -*- 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'
regall
Для понимания концепций ООП лучше всего обратится к истокам. Под истоками я понимаю книгу Бьярна Страуструпа (“Язык программирования С++”). По крайней мере для себя я нашел эту книгу лучшей.
http://wmate.ru/ebooks/book11.html
Ferroman
Я по ней только обозначения учил, понятнее мне после нее не стало :)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB