Python:如何继承Sqlite3.Cursor并添加自定义方法

2 投票
1 回答
1913 浏览
提问于 2025-04-18 06:41

我想自己做一个叫MagicCursor的类。我希望它能继承sqlite3.Cursor()里的所有方法和属性。但是看起来这并不是那么简单。

通常我们是这样创建一个游标的:

import sqlite3
conn = sqlite3.connect('test.db')
crs = conn.cursor()

因为中间有一个连接。所以我觉得我得先定义自己的连接类,然后再定义自己的游标。

这是我想实现的内容:

import sqlite3
conn = MyConnect('test.db') ## this returns me a connect object, inherit from         sqlite3.Connection 
crs = conn.cursor() ## this returns me a MyCursor class,
                ## which inherit from sqlite3.Cursor() and has my customized method

这是我的代码,但失败了。

class MyConnect(sqlite3.Connection):
    def cursor(self):
        return MyCursor(self)

class MyCursor(sqlite3.cursor):
    def __init__(self, connect):
        self = connect.cursor()

    def mymethod1(self, argv)
         ...... return ...... ## what ever I defined

有没有人知道怎么实现这个?

1 个回答

6
import sqlite3
class MyConnect(sqlite3.Connection):
    def cursor(self):
        return super(MyConnect, self).cursor(MyCursor)

class MyCursor(sqlite3.Cursor):
    def mymethod1(self, argv):
        print('Got here')

conn = sqlite3.connect(':memory:', factory=MyConnect)
print(conn)
# <__main__.MyConnect object at 0x90db66c>

cursor = conn.cursor()
print(cursor)
# <__main__.MyCursor object at 0x90d19dc>

cursor.mymethod1('foo')
# Got here

在这个例子中,super(MyConnect, self).cursor(MyCursor) 其实是在调用 sqlite3.Connection.cursor(MyCursor)

sqlite3.Connection.cursor 这个方法可以接受一个可选的参数,叫做 cursorClass。如果你提供了这个参数,它就会用来创建光标的类。

撰写回答