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



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

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

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

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

方法运行一些代码,该代码可以创建它们喜欢的任何类的实例。SQLite 库大致这样做(确切的代码更复杂,并且是用 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 中,嵌套类只是父类的属性,仅此而已。这种嵌套通常用处不大,只会降低可读性。

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

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

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

type(c)

您将获得:

<class 'sqlite3.Cursor'>

最新更新