如何在已编译模块的类中添加方法?

时间:2019-01-25 11:38:32

标签: python python-3.x sqlite

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

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

1 个答案:

答案 0 :(得分:2)

sqlite3.connect()sqlite3.onnection.cursor()方法均允许您指定np.apply_along_axis参数,以使用自己的子类替换常规连接或游标类。您可以使用这些路径来提供自己的factory方法。

因此,您可以将cursor.chronology()类子类化以添加您的自定义方法:

sqlite3.Cursor

然后可以将该类用作import sqlite3 class ChronologyCursor(sqlite3.Cursor): def chronology(self): print("Hello World") # ... 调用的factory参数:

cursor()

您还可以使用连接工厂(子类>>> 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()函数。基本软件包是纯Python,因此您可以 将其中的替代sqlite3函数添加到猴子中。

因此,在您的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()通话。