【问题标题】:Python: How to successfully inherit Sqlite3.Cursor and add my customized methodPython:如何成功继承Sqlite3.Cursor并添加我自定义的方法
【发布时间】:2014-05-16 00:53:24
【问题描述】:

我想创建自己的 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

有人知道如何实现吗?

【问题讨论】:

  • 我不相信你想重新分配 self 就像你在 __init__ 方法中所做的那样。那不应该是sqlite3.cursor.__init__(self)(或类似的东西)吗? Sqlite3 是我系统上的编译扩展 - 您必须查找调用签名并查看它如何(或是否)支持连接参数。您可能无法以这种方式将方法添加到已编译的扩展中。

标签: python sqlite


【解决方案1】:
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。提供时,就是用于实例化光标的类。

【讨论】:

  • 有效!!谢谢!!你能告诉我这是怎么工作的吗?
  • super 调用(粗略地说)MyConnect 的父类的游标方法。在这种情况下,sqlite3.Connection.cursor.
  • 更准确的说是super(MyConnect, self).cursor()type(self)之后调用了MyConnect的MRO中下一个类的游标方法。 may or may not be a parent classMyConnect
猜你喜欢
  • 2017-09-10
  • 2022-08-19
  • 1970-01-01
  • 2022-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
相关资源
最近更新 更多