python - 重新加载模块的 isinstance 行为

标签 python import reload isinstance

给定以下两个 .py 文件:

类.py

class A(object):
    pass

主要.py

def importer(klass):
    """
    Used to import classes from there python qalname
    """
    import_ = lambda m, k: getattr(__import__(m, fromlist=k), k)
    klass = klass.split('.')
    module = '.'.join(klass[:-1])
    klass = klass[-1]
    return import_(module, klass)

from aclass import A

import_A = importer('aclass.A')
print isinstance(A(), import_A)  # Expected to be true 
print isinstance(import_A(), A)  # Expected to be true 

在这个阶段,一切正常(我的程序打印True\nTrue) 但是如果我修改 importer 方法来强制重新加载,即:

这一行:

    import_ = lambda m, k: getattr(__import__(m, fromlist=k), k)

替换为:

    import_ = lambda m, k: getattr(reload(__import__(m, fromlist=k)), k)

我的程序返回

False
False

而且我不理解这种行为。

最佳答案

重新加载模块意味着重新执行其内容,在本例中为 class A(object): pass。所以它创建了另一个不同的类。这与以下行为相同:

class A(object):
    pass
a = A()
class A(object):          # a different class
    pass
print isinstance(a, A)    # False

这应该足以解释为什么简单的 reload() 通常不是一个好主意。我相信其他人可以指出实现更复杂的重新加载过程的框架,例如修补旧类被认为与新类相同。

关于python - 重新加载模块的 isinstance 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15876395/

相关文章:

python - 将列表附加到数据框

c# - 在 DLL 中编译类并在 C# 中的另一个项目中引用它

c - 从c中的文件导入所有字符串

python - 使用 apply 和 map 添加 pandas 中两列的值

python - 使用 python boto3 授权 aws 安全组以及每个入口的描述

javascript - 一行导入多个组件(VueJs)

javascript - 在 Router5 中刷新 View 状态时,另一个 View 的一部分重新出现

android - PendingIntent 在 Activity 重新加载时继续触发

swift - 通过按下按钮更新 UIView

java - JVM 堆大小是否强制或如何影响子进程?