gpt4 book ai didi

python - 重新加载模块后在 Python 中进行对象类型转换? [用于即时代码更改]

转载 作者:太空狗 更新时间:2023-10-30 02:49:15 25 4
gpt4 key购买 nike

我正在运行一个交互式 python session ,它构建了需要很长时间才能加载的 big python 数据结构(5+ GB),所以我想利用 Python on-the - 最大限度地发挥代码更改的能力(尽管有时,不必为此做太多计划)。

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

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

class A():
def f(self):
print "old class"

这是一个互动环节:

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)

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

TypeError: unbound method f() must be called with A instance as first argument (got A instance instead)

Python 显然不乐意接收 A 的旧实例,即使它们在功能上基本上是等效的类型(在我的代码中)——有什么方法可以让我将它“类型转换”为新的实例类型,以便 Python 不会提示?道德上类似于:M.A.f( (M.A) old_a ) ?

最佳答案

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

old_a.__class__=M.A
old_a.f()

只要您没有更改类方法和实例变量之间的关系,更改 __init__ 所做的或类似的事情,这就完全没问题。

编辑:正如 jsbueno 指出的那样: __init____new__ 方法在改变 __class__。此外,新的 __del__ 将在销毁时调用

关于python - 重新加载模块后在 Python 中进行对象类型转换? [用于即时代码更改],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9165756/

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