重装模块后,Python中的对象类型转换?[用于即时代码更改]

Sim*_*ien 4 python casting module object reload

我正在运行一个交互式python会话,它构建了大量的 python数据结构(5+ GB),这需要花费很长时间才能加载,因此我希望最大限度地利用Python的动态代码更改能力(尽管有时候,没有不得不为此计划太多).

我目前的问题如下:我有一个类的旧实例,我后来修改了代码并重新加载了模块 - 我希望旧实例能够使用新的函数定义.如果不手动将旧实例中的所有信息复制到新的实例,我该怎么做?

这是我尝试过的.假设我有模块M.py:

class A():
    def f(self):
        print "old class"
Run Code Online (Sandbox Code Playgroud)

这是一个互动环节:

import M
old_a = M.a()

# [suppose now I change the definition of M.A.f in the source file]

reload(M)
# I attempt to use the new class definition with the old instance:
M.A.f(old_a)
Run Code Online (Sandbox Code Playgroud)

此时我从Python得到以下类型错误:

TypeError: unbound method f() must be called with A instance as first argument (got A instance instead)
Run Code Online (Sandbox Code Playgroud)

Python显然不高兴收到A的旧实例,即使它们基本上是功能相同的类型(在我的代码中) - 有没有什么方法可以"输入"它到新的实例类型,以便Python不会抱怨?道德上的东西:M.A.f( (M.A) old_a )

Joh*_*erg 5

Python中没有强制转换,但您可以更改现有对象的类:它完全合法并完成工作:

old_a.__class__=M.A
old_a.f()
Run Code Online (Sandbox Code Playgroud)

只要你没有改变类方法和实例变量之间的关系,改变了什么__init__或类似的东西,这是完全正常的.

编辑:jsbueno指出:在更改时调用__init____new__方法.此外,新的被称为破坏.__class____del__