我可能没有想到Pythonic方法。 我有一个类,SQLDB,它使用使用fetchall把所有的行从游标:使用实例方法覆盖父级的方法
class SqlDB(object):
@classmethod
def executeQuery(cls, cursor, query, params):
# code to set up and execute query here
rows = cls.fetchRows(cursor)
# other code here
@classmethod
def fetchRows(cls, cursor):
print "in class SqlDB"
return cursor.fetchall()
所以我想补充一点,使用支持fetchmany一个子类,并得到了批量初始化:
class SqlDBBatch(SqlDB):
def __init__(self, batchsize=1000):
self.batchsize = batchsize
def fetchRows(self, cursor):
print "in SqlDBBatch"
while True:
results = cursor.fetchmany(self.batchsize)
# more code
当然,由于原始的executeQuery函数正在调用传递给它的类的fetchRows,所以当我尝试调用SqlDBBatch实例上的executeQuery时,我得到了TypeError: unbound method fetchRows() must be called with SqlDBBatch instance as first argument (got CursorDebugWrapper instance instead)
。有什么办法来实现我要去的地方,我可以用实例方法覆盖父类的方法,并让父类能够调用子类的实现?
实例方法仅在实例的上下文中才有意义。在类方法中,您没有实例来调用实例方法。这确实没有意义。为什么'executeQuery'和'fetchRows'必须是类方法?他们似乎是非常有意义的实例方法... – BartoszKP
'SqlDB'父类没有任何状态附加到它,因为它做一个'fetchall()'每次没有参数,所以它看起来像它会作为一种类方法是有意义的。对于'SqlDBBatch',它正在使用批处理大小进行初始化,因此可以使用它的'fetchmany()'调用,因此实例中的值会影响一次提取多少行。 – TransatlanticFoe
1)似乎很奇怪,一个DB类没有状态 - 通常它是一个数据库连接。 2)缺乏状态不足以决定使用类方法。你的设计中的问题就是一个很好的例子。 – BartoszKP