gpt4 book ai didi

python - 在模块中使用 isinstance

转载 作者:行者123 更新时间:2023-11-28 21:21:24 24 4
gpt4 key购买 nike

我观察到一个涉及对象“AuditResult”的奇怪现象,我希望有人能帮助我理解。我有一个这样设置的模块:

model\   __init__.py   common.py  (AuditResult is imported from audit.py into here)   audit.py   (where AuditResult lives)   objects.py   test.py

In test.py, if I imported the AuditResult object using from common import AuditResult, the following results occur:

>>> isinstance(audit_obj, AuditResult)
False
>>> type(audit_obj)
<class 'model.audit.AuditResult'>
>>> AuditResult
<class 'audit.AuditResult'>

但是,如果我使用 from model.common import AuditResult,代码会按预期运行。

>>> isinstance(audit_obj, AuditResult)
True
>>> type(audit_obj)
<class 'model.audit.AuditResult'>
>>> AuditResult
<class 'model.audit.AuditResult'>

最佳答案

问题在于:

from common import AuditResult

common 模块导入为“独立模块”,同时:

from model.common import AuditResult

将其导入为model 的子模块。 Python 区分 这两个模块!前一种方式导入的common和后一种方式导入的common之间<​​em>没有关系。由于代码执行了两次,AuditResult不同 类,因此 isinstance 正确 返回 False 当你混合它们时。

你可以测试这样做:

import common
from model import common as common2
print(common is common2)

您会看到这会打印出 False。如果模块不同,它们的所有内容也会不同:

print(common.AuditResult is common2.AuditResult)

将打印False

请记住,python 对类型使用结构等价,即它检查“类本质上相同”。 isinstance 只是检查与实例关联的类 确切作为第二个参数传递的类。在您的情况下,两个 AuditResult不同的 类,因此 audit.AuditResult 的实例不是 model.audit.AuditResult 的实例。


事实上,这是我知道在何处可以将模块导入两次而不会弄乱导入机制内部结构的唯一方法。


我建议你避免子模块的绝对导入,即:

from common import AuditResult

如果要进行相对导入,请使用相对导入语法:

from .common import AuditResult

注意 .(点)。这告诉 python 从当前包中导入 common

关于python - 在模块中使用 isinstance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21498211/

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