Найти - Пользователи
Полная версия: Python ООП
Начало » Python для новичков » Python ООП
1
zloymih
Здравствуйте. :) я начал разбираться с ООП. Раньше опыта с ООП не имел, только процедуры и функции. Почитав литературы, я написал два класса.
1. Для вывода сообщений в CGI скрипте
2. Для работы с БД
Пожалуйста, опытные программисты укажите мне на недочеты или ошибки. И еще я не совсем понял про self. (Когда ее надо использовать, а когда нет).
class message:
'Выводит сообщение'
def __init__(self, message):
self.message = message
self.pattern = '<div class="{0}">{1}: {2}</div>'

def error(self, msg):
return self.pattern.format('error', self.message, msg)

def notice(self, msg):
return self.pattern.format('notice', self.message, msg)

def success(self, msg):
return self.pattern.format('success', self.message, msg)


class DataBase:
'Работа с БД'
def __init__(self, db):
self.db = db
self.conn = sqlite3.connect(self.db, detect_types = sqlite3.PARSE_DECLTYPES)
self.conn.isolation_level = None
self.cur = self.conn.cursor()

try:
self.cur.execute('PRAGMA foreign_keys = ON;')
self.cur.execute('select * from table1;')
except sqlite3.OperationalError:
pass
# если базы данных нет, то создаем её из схемы
# self.cur.executescript(open('schema.sql').read())

self.error = False
self.buffer = ''

def executeSQL(self, query, param=[]):
m = message('sqlite3')
if sqlite3.complete_statement(query):
self.error = False
try:
query = query.strip()
self.cur.execute(query, param)
if query.lstrip().upper().startswith('SELECT'):
self.buffer = self.cur.fetchall()
except sqlite3.Error as e:
self.error = True
self.buffer = m.error((e.args[0], query))
else:
self.error = True
self.buffer = m.error(('Синтаксическая ошибка', query))
dartNNN
Именно по ООП замечаний нет, т.к. классы очень маленькие и сделать в них что-то не так сложновато:)
Вобщем по коду можно сказать:
zloymih
try:
query = query.strip()
self.cur.execute(query, param)
if query.lstrip().upper().startswith('SELECT'):
self.buffer = self.cur.fetchall()
Непонятно зачем все это пихать в try. Если проверяется успешность выполнения запроса, то его выполнение и должно быть в try
Неясно зачем тут self.error
Неясно зачем делать lstrip после strip (который надо бы поместить в начало метода)
m - плохое имя для переменной, слишком короткое и непонятное, нужно хотя бы msg.
Строки документации (docstring не знаю как по русски:)) пишут обычно в тройных кавычках. Такие короткие строки документации бессмысленны: либо подробнее описываете класс и/или методы, либо не пишите ничего (мое личное мнение)
Класс message можно сделать “статическим” (в Python такого понятия вообще-то нет, т.к. его экземпляр все же можно будет создать), т.е. свойство message заменить строковой константой или может свойством класса. Все методы писать без self и вызываться они тогда будут так message.error(msg) (т.е. через имя класса). Таким образом избавляемся от необходимости создавать экземпляр класса. Практической пользы от этого мало, но в рамках обучения очень полезно:)

Про self - все просто. Это указатель на экземпляр класса. Т.е. когда ты вызываешь метод ОБЪЕКТА то в метод первым параметром неявно идет ссылка на объект. Вызываешь метод класса - ничего неявного не передается.
Соответственно если пишешь self.error - это свойство объекта, которое живет вместе с объектом. Если пишешь просто error - то это локальная переменная и живет она только до конца метода.
zloymih
dartNNN, большое спасибо за проявленное внимание, советы и замечания. Будем учиться дальше.

p.s.
А кусок кода
try:
query = query.strip()
self.cur.execute(query, param)
if query.lstrip().upper().startswith('SELECT'):
self.buffer = self.cur.fetchall()
я взял из примера в http://docs.python.org/py3k/library/sqlite3.html?highlight=sqlite#sqlite3 11.6.1
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