2012-03-21 18 views
0

因此,MainApp.py中的一些代碼就像這樣,我關心的是DBQuery發生的位置。 DB302.py與MainApp.py位於同一文件夾中,幷包含一個名爲DB302的類,其成員方法查詢如下所示。爲什麼只有當我使用DB302.DB302.query(DBQuery...)DBQuery已經是DB302.DB302...的實例有沒有辦法不必先使用,實例DBQuery = DB302.DB302()而不是DBQuery = DB302,也可以用它作爲`DBQuery.query(Instance ,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 
+0

好吧出於某種原因使用預期的實例化'的DBQuery = DB302.DB302()''然後DBQuery.query(ARG1,Arg2)將'現在的作品。無論如何減少它到DB302()的任何方式?靜態從查詢方法中獲取'throwsU()'(此複製粘貼從底部開始的第3行) – Supernovah 2012-03-21 02:20:09

回答

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繼承。
這個問題和相應的答案可能會提供一些見解:Proper way to declare custom exceptions in modern Python?

+0

好的,謝謝你的建議!爲了處理錯誤,我刪除了未知異常的重載,並能夠發現問題。這是'cursor'的範圍。如果我想在另一種方法中使用它,即使是在同一個類中,似乎我也必須在與「self.variable」或「self.method」相同的類中編寫任何內容。爲什麼是這樣?是否有一種方法將變量本地化到自己的類中而不使用引用對象?我知道Python並不嚴格地具有私有的,公共的和全局的變量。 – Supernovah 2012-03-21 02:43:24

+0

非常歡迎。找到錯誤很好。回答你的問題:你必須使用'self'將變量綁定到類的實例。否則,變量是一個類變量,如果有的話,你不需要那些變量。 – bernie 2012-03-21 02:46:08

相關問題