gpt4 book ai didi

python - 如何向已编译模块中的类添加方法?

转载 作者:行者123 更新时间:2023-12-01 01:15:44 26 4
gpt4 key购买 nike

文件scheduling.py当前不包含任何内容。它需要包含什么,所以最后一个语句 cursor.chronology() 会打印 Hello World?我确实希望此方法可用于任何可能通过 sqlite.connect() 定义的内容。

import sqlite3
import scheduling
db = sqlite3.connect(':memory:')
cursor = db.cursor()
cursor.chronology()

最佳答案

两者都是sqlite3.connect()sqlite3.onnection.cursor()方法允许您指定工厂参数来用您自己的子类替换普通连接或游标类。您可以使用这些路径来提供您自己的 cursor.chronology() 方法。

因此,您需要对 sqlite3.Cursor 类进行子类化以添加自定义方法:

import sqlite3

class ChronologyCursor(sqlite3.Cursor):
def chronology(self):
print("Hello World")
# ...

然后,您可以使用该类作为 cursor() 调用的 factory 参数:

>>> db = sqlite3.connect(':memory:')
>>> cursor = db.cursor(factory=ChronologyCursor)
>>> type(cursor)
<class '__main__.ChronologyCursor'>
>>> cursor.chronology()
Hello World

您还可以使用连接工厂(sqlite3.connection() 的子类)来始终使用游标类:

class ChronologyConnection(sqlite3.Connection):
def cursor(self, *args, **kwargs):
if kwargs.get('factory') is None:
kwargs['factory'] = ChronologyCursor
return super().cursor(*args, **kwargs)

然后使用db = sqlite3.connect(':memory:',factory=ChronologyConnection)来使用新的连接类:

>>> db = sqlite3.connect(':memory:', factory=ChronologyConnection)
>>> type(db)
<class '__main__.ChronologyConnection'>
>>> cursor = db.cursor()
>>> cursor.chronology()
Hello World

我强烈建议反对修补sqlite3.connect()函数以使上述工厂成为默认工厂,但如果您必须有这个为了透明,您可以将自己的 connect() 函数放在 sqlite3 模块上。基础包是纯 Python,因此您可以将替代的 connect() 函数猴子补丁到其中。

因此,在您的 scheduling 模块中,您可以放置​​上述类,然后使用:

_sqlite3_connect = sqlite3.connect

def chronology_connect(*args, **kwargs):
if kwargs.get('factory') is None:
kwargs['factory'] = ChronologyConnection
return _sqlite3_connect(*args, **kwargs)

sqlite3.connect = chronology_connect

现在导入scheduling足以使用您的备用连接工厂调用sqlite3.connect():

>>> import sqlite3
>>> import scheduling
>>> db = sqlite3.connect(':memory:')
>>> cursor = db.cursor()
>>> cursor.chronology()
Hello World
>>> type(db)
<class 'scheduling.ChronologyConnection'>
>>> type(cursor)
<class 'scheduling.ChronologyCursor'>

不想执行上述操作的原因是,它使sqlite3.connect()调用偏离规范,其行为方式与文件指出。从长远来看,这会使您的代码更难维护。我会坚持使用显式的 sqlite3.connect(....,factory=ChronologyConnection) 调用。

关于python - 如何向已编译模块中的类添加方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54364587/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com