cursor()是python中sqlite3模块中connect()类的一个类吗?

时间:2017-05-29 08:16:26

标签: python sqlite

我最近开始在python中学习sqlite3,发现cursor()令人困惑。

import sqlite3
conn=sqlite3.connect('datebase.db')
c=conn.cursor()
c.execute('')

cursor()connect()内的嵌套类,还是类方法或两者都不是。 请解释一下。

2 个答案:

答案 0 :(得分:1)

不要将方法与类或实例混淆。仅仅因为一个方法返回一个实例,并不意味着该类存在于另一个类中。

一个方法运行一些代码,该代码可以创建他们喜欢的任何类的实例。 SQLite库执行此操作,粗略exact code is more complex, and written in C):

class Connection:
    def cursor(self):
        cursor = Cursor(self)
        if self.row_factory is not None:
            cursor.row_factory = self.row_factory
        return cursor

class Cursor:
    def __init__(self, connection):
        self.connection = connection
        # set other attributes for the instance

因此Connection().cursor()方法返回一个对象,该对象将引用保存回连接,但类本身在其他地方定义。

该模块可让您直接访问这些类;你可以用同样的方式创建光标:

>>> import sqlite3
>>> sqlite3.Connection
<class 'sqlite3.Connection'>
>>> sqlite3.Cursor
<class 'sqlite3.Cursor'>
>>> conn = sqlite3.connect(':memory:')
>>> conn
<sqlite3.Connection object at 0x105938570>
>>> sqlite3.Cursor(conn)
<sqlite3.Cursor object at 0x105bcbea0>

但是,使用Connection().cursor()方法可确保您不会忘记将其正确地附加到正确的连接,而Connection.cursor()方法也会执行一些内部清理工作。对内存管理很重要(我在上面省略了它,但你可以研究我链接的C代码)。

请注意,Python没有像C#或Java那样的隐私模型。在这些语言中,您可以使用嵌套的内部类来提供对不允许使用其他代码的属性的权限访问。在Python中,嵌套类只是父类上的属性,仅此而已。这种嵌套通常很少使用,只会降低可读性。

答案 1 :(得分:0)

正如Carles Explained所说,.cursor()是这里返回类型为Cursor的对象的方法。要自己验证这一点,请使用python解释器打开临时连接:

import sqlite3
conn = sqlite3.connection(':memory:')
c = conn.cursor()

现在,获取光标后,只需输入:

type(c)

你会得到:

<class 'sqlite3.Cursor'>