在模块中使用isinstance

2024-10-03 02:43:36 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

在测试.py,如果我使用from common import AuditResult导入AuditResult对象,则会出现以下结果:

^{pr2}$

但是,如果我使用from model.common import AuditResult,代码的功能与预期一样。在

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

Tags: 模块对象frompyimportobjmodelinit
1条回答
网友
1楼 · 发布于 2024-10-03 02:43:36

问题在于:

from common import AuditResult

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

^{pr2}$

将它作为model的子模块导入。Python区分这两个模块的!前一种方式导入的common与后一种情况下导入的common之间没有任何关系。由于代码执行了两次,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只需检查与实例关联的类is是否正好是作为第二个参数传递的类。在您的例子中,两个^{不同的类,因此audit.AuditResult的实例是model.audit.AuditResult的实例。在


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


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

from common import AuditResult

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

from .common import AuditResult

{cd15}(注)。这告诉python从当前包导入common。在

相关问题 更多 >