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

Поэтому некоторый код в 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.