成员方法、模块、类变量及其作用域。。。想知道如何使用它们

2024-09-19 23:29:48 发布

您现在位置:Python中文网/ 问答频道 /正文

所以一些代码主应用程序这样,我关心的行是DBQuery发生的位置。DB302.py与主应用程序并包含一个名为DB302的类,其成员方法查询如下所示。为什么只有当我使用DB302.DB302.query(DBQuery...)DBQuery已经是DB302.DB302...的一个实例时,它才起作用呢?有没有一种方法可以不必首先使用实例DBQuery = DB302.DB302()而只使用DBQuery = DB302并且还可以使用它作为`数据库查询.query(例如,var1,var2)。你知道吗

我的第二个问题与DB302.py中self.method or variable的使用有关。我用对了吗?我现在出现了ThrowsU(),但我不知道为什么。我的数据库已设置为正常工作,我可以通过python终端访问它。Id是一个主键,我为每个测试用例递增它。你知道吗

#MainApp.py
import DB302

class MainApp(object):

@cherrypy.expose
def default(self, *args, **kwargs):     
    page = "<b>&quot;args&quot; has %d variables</b><br/>\n" % len(args)
    for x in xrange(0, len(args)):
        if args[x] == "":
            page += "<i>error</i>\n"
        else:
            page += args[x] + "<br/>\n"

    page += "<b>&quot;cherrypy.request.params&quot; has %d variablez</b><br/>\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 + "<br/>\n"

    page += """
            <form name="form1" method="POST" action="/testURL/part2">
                <input name="username" type="text" maxlength="256" autocomplete="off">
                </input>
            </form>
            """

    return page

#DB302.py
import sqlite3

class DB302(object):

    def __init__(self):
        print "<b>Within DB302</b><br/>\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's a select query
                    allRows = self.cursor.fetchall()
                    return allRows
                elif queryType == "DELETE":
                    # return affected rows if there's 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

Tags: brselfreturnifdefpageargsquery
1条回答
网友
1楼 · 发布于 2024-09-19 23:29:48

要使调用类方法更容易,可以执行以下操作:

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继承的。
这个问题和附带的答案可以提供一些见解:Proper way to declare custom exceptions in modern Python?

相关问题 更多 >