Python:将新函数注入类的实例中?

Python:将新函数注入类的实例中?,python,Python,我试图操纵\uuuMRO\uuuuu但它是只读的 用例如下所示: 从pyodbc(DBAPI)创建的连接对象,用于提供名为“autocommit”的属性。最近,为了更好地管理资源,我在pyodbc周围包装了一个SQLAlchemy数据库连接池。新的数据库池将返回一个连接代理类\u ConnectionFairy,该类不再公开自动提交属性 我很想不谈第三方守则。因此,\u ConnectionFairy的继承实际上不是一个选项(我可能需要重写Pool类来更改它创建连接代理的方式。有关源代码,请参阅

我试图操纵
\uuuMRO\uuuuu
但它是只读的

用例如下所示:

从pyodbc(DBAPI)创建的连接对象,用于提供名为“autocommit”的属性。最近,为了更好地管理资源,我在pyodbc周围包装了一个SQLAlchemy数据库连接池。新的数据库池将返回一个连接代理类
\u ConnectionFairy
,该类不再公开
自动提交属性

我很想不谈第三方守则。因此,
\u ConnectionFairy
的继承实际上不是一个选项(我可能需要重写Pool类来更改它创建连接代理的方式。有关源代码,请参阅)

一个不那么优雅的解决方案是改变所有的

conn.autocommit = True

因此,我想知道是否有可能将一组getter、setter和property注入到
\u ConnectionFairy

的实例中。您可以使用以下语法“扩展”几乎任何类:

def new_func(self, param):
    print param

class a:
    pass

a.my_func = new_func
b = a()
b.my_func(10)
更新

如果要为某些方法创建某种包装,可以使用getattr和setattr保存原始方法,并用实现替换它。我在我的项目中做过,但方式有点不同:

以下是一个例子:

class A:
    def __init__(self):
        setattr(self, 'prepare_orig', getattr(self,'prepare'))
        setattr(self, 'prepare', getattr(self,'prepare_wrapper'))

    def prepare_wrapper(self,*args,**kwargs):
        def prepare_thread(*args,**kwargs):
            try:
                self.prepare_orig(*args,**kwargs)
            except:
                print "Unexpected error:", sys.exc_info()[0]
        t = threading.Thread(target=prepare_thread, args=args, kwargs=kwargs)
        t.start()

    def prepare(self):
        pass
这段代码的思想是,其他开发人员只需在派生类中实现prepare方法,它将在后台执行。这不是你所要求的,但我希望它能在某种程度上帮助你

class A:
    def __init__(self):
        setattr(self, 'prepare_orig', getattr(self,'prepare'))
        setattr(self, 'prepare', getattr(self,'prepare_wrapper'))

    def prepare_wrapper(self,*args,**kwargs):
        def prepare_thread(*args,**kwargs):
            try:
                self.prepare_orig(*args,**kwargs)
            except:
                print "Unexpected error:", sys.exc_info()[0]
        t = threading.Thread(target=prepare_thread, args=args, kwargs=kwargs)
        t.start()

    def prepare(self):
        pass