2011-12-01 218 views
2

讓我們以這個類爲例,它擴展了MySQLDB的連接對象。成員函數中的Python調用構造函數

class DBHandler(mysql.connections.Connection): 
    def __init__(self,cursor=None): 
     if cursor == None: 
      cursor = 'DictCursor' 

      super(DBHandler,self).__init__(host = db_host, 
       user = db_user, 
       passwd = db_pass, 
       db = db, 
       cursorclass=getattr(mysql.cursors, cursor)) 


    def getall(self,q,params=None): 
     try: 
      cur = self.cursor() 
      cur.execute(q,params) 
      res = cur.fetchall() 
      return res 
     except mysql.OperationalError: 
      #this is the line in question 
      pass 


    def execute(self,q,params): 
     cur = self.cursor() 
     cur.execute(q,params) 
     self.commit() 
     return cur.lastrowid 

這件事在很大程度上是一個方便,以獲得更簡單的訪問常見的所需查詢。

在標註有註釋的行上,是否有可能在Python中調用對象構造函數,即使這是一個成員函數?我使用這個例子來說明,因爲它將有效地重新建立連接,當它在運行查詢之前被超時放下時。

我知道MySQLdb的ping()方法,這實際上只是一個能力問題。 在python中,是否可以從實例上調用的成員函數內調用構造函數來重新初始化該實例?謝謝!

回答

5

是的,你可以,因爲最好是用另一種方法提取初始化代碼(def init(self):)。

這是因爲__init__不是對象的構造函數,它更像是實例的「初始值設定項」,真正的構造函數是__new__方法,它負責創建實例。

相關問題