我观察到一个奇怪的现象,涉及对象“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对象,则会出现以下结果:
但是,如果我使用from model.common import AuditResult
,代码的功能与预期一样。在
>>> isinstance(audit_obj, AuditResult)
True
>>> type(audit_obj)
<class 'model.audit.AuditResult'>
>>> AuditResult
<class 'model.audit.AuditResult'>
问题在于:
将
^{pr2}$common
模块作为“独立模块”导入,同时:将它作为
model
的子模块导入。Python区分这两个模块的!前一种方式导入的common
与后一种情况下导入的common
之间没有任何关系。由于代码执行了两次,AuditResult
是不同的类,因此isinstance
正确地在混合它们时返回False
。在您可以通过以下操作进行测试:
您将看到这个打印
False
。如果模块不同,它们的所有内容也不同:将打印
False
。在请记住,python不会对类型使用结构等价,也就是说,它会检查“类本质上是相同的”。是不同的类,因此
isinstance
只需检查与实例关联的类is
是否正好是作为第二个参数传递的类。在您的例子中,两个^{audit.AuditResult
的实例是model.audit.AuditResult
的实例。在事实上,这是我知道在哪里可以导入一个模块两次而不会弄乱导入机制的内部的唯一方法。在
我建议您避免子模块的绝对导入,即:
如果要进行相对导入,请使用相对导入语法:
{cd15}(注)。这告诉python从当前包导入
common
。在相关问题 更多 >
编程相关推荐