2011-12-01 203 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__方法,它负责创建实例。

相关问题