Методы членов, модули, переменные класса и их области применения... Попытка выяснить, как их использовать

Поэтому некоторый код в MainApp.py идет так, строки, которые меня беспокоят, - это то, где происходит DBQuery. DB302.py находится в той же папке, что и MainApp.py, и содержит класс DB302 с запросом методов-членов, показанный ниже. Почему это работает, только когда я использую DB302.DB302.query(DBQuery...) где DBQuery уже является экземпляром DB302.DB302... Есть ли способ не использовать во-первых, экземпляр DBQuery = DB302.DB302() вместо этого просто DBQuery = DB302 а также иметь возможность использовать его затем как "DBQuery.query (экземпляр, var1, var2).

Мой второй вопрос касается использования self.method or variable в DB302.py. Правильно ли я использовал их? ThrowsU() я получаю ThrowsU(), и не могу понять, почему. Моя БД настроена на правильную работу, и я могу получить к ней доступ через терминал python. Ид - первичный ключ, и я увеличиваю его для каждого тестового примера.

#MainApp.py
import DB302
class MainApp(object):
@cherrypy.expose
def default(self, *args, **kwargs): page = "<b>"args" has %d variables</b>\n" % len(args) for x in xrange(0, len(args)): if args[x] == "": page += "<i>error</i>\n" else: page += args[x] + "\n" page += "<b>"cherrypy.request.params" has %d variablez</b>\n" % len(cherrypy.request.params) for key, value in cherrypy.request.params.items(): if cherrypy.request.params[key] == "": page += "<i>empty</i>\n" elif key == "username": DBQuery = DB302.DB302() data = DB302.DB302.query(DBQuery, 'SELECT * FROM test', 'SELECT') else: page += key + " = " + value + "\n" page += """ <form name="form1" method="POST" action="/testURL/part2"> </form> """ return page
#DB302.py
import sqlite3
class DB302(object): def __init__(self): print "<b>Within DB302</b>\n" def throws(self): raise RuntimeError('Connection to DB failed, terminating...') def throwsQ(self): raise RuntimeError('Error in DB query, terminating...') def throwsU(self): raise RuntimeError('Unknown DB error encountered...') def connect(self): # Where the DB connection will be made CS302="<!-- Private -->" # The datbase file is on my desktop try: DBCon=sqlite3.connect(CS302) cursor=DBCon.cursor() return True except IOError: self.throws() except: self.throwsU() else: return False def disconnect(self): # Used to disconnect... try: self.cursor.close() return True except IOError: self.throws() except: self.throwsU() else: return False def query(self, queryString, queryType): # Queries will be made here if self.connect(): try: self.cursor.execute(queryString) if queryType == "SELECT": # return all the rows if there a select query allRows = self.cursor.fetchall() return allRows elif queryType == "DELETE": # return affected rows if there a deletion rowsAffected = self.cursor.rowcount() self.DBCon.commit() return rowsAffected elif queryType == "INSERT": # return true if success self.DBCon.commit() return True elif queryType == "CREATE": self.DBCon.commit() return True else: return False except IOError: self.throwsQ() except: self.throwsU() else: return False
1 ответ

Чтобы упростить вызов метода класса, вы можете:

from DB302 import DB302 as DBQuery
...
DBQuery.query(Arg1, Arg2)

Для вашего второго вопроса: Вы должны избегать, когда это возможно, использования так называемого "голого", except, except: Эта восхитительная конструкция имеет несчастливое свойство сделать отладку сложнее, чем нужно.

Поэтому я бы рекомендовал вместо этого получить совет отсюда: http://wiki.python.org/moin/HandlingExceptions И ловить все исключения таким образом, что вы распечатываете информацию об исключении:

import sys
... except: e = sys.exc_info()[1] print e

Я также замечаю, что ваши пользовательские исключения не наследуются от Exception. Этот вопрос и сопровождающие ответы могут дать некоторое представление: Правильный способ объявления пользовательских исключений в современном Python?

licensed under cc by-sa 3.0 with attribution.