从两条不同路径导入的类不相等?

Mar*_*lla 7 python python-module python-import

似乎使用两个不同的PYTHONPATHs 导入的实体不是相同的对象.

我在我的代码中遇到了一个小问题,我想用一个小例子来解释它.

我创建了源代码树:

a/
  __init__.py
  b/
    __init__.py
    example.py
Run Code Online (Sandbox Code Playgroud)

在example.py中:

class Example:
  pass
Run Code Online (Sandbox Code Playgroud)

从文件夹的父级a,我运行python和这个测试:

>>> import sys
>>> sys.path.append("/home/marco/temp/a")
>>> 
>>> import a.b.example as example1
>>> import b.example as example2
>>> 
>>> example1.Example is example2.Example
False
Run Code Online (Sandbox Code Playgroud)

所以问题是:结果为什么False?即使通过两个不同的路径导入,该类也是相同的.如果类是自定义异常并且您尝试捕获它,那么这是一个完全混乱except.

用python 3.4.3测试

Dun*_*can 10

在Python中,该class语句是可执行语句,因此每次执行它都会创建一个新类。

当您导入模块时,Python 将检查sys.modules指定路径中的模块是否已存在。如果是,那么您将只返回相同的模块,如果不是,它将尝试加载该模块并执行它包含的代码。

因此,同一模块的两个不同路径将加载代码两次,这会执行该class语句两次,并且您会定义两个独立的类。

a.py当人们拥有一个作为脚本运行的文件,然后在另一个模块中尝试导入时,通常会遇到这种情况a。该脚本被加载,因为__main__它具有与导入的模块不同的类和不同的全局变量。

其寓意是,引用模块的方式始终保持一致。

  • 不是文件路径,而是模块路径,即模块的名称,这里是“abexample”或“b.example”。两个不同的名称,两个不同的模块。 (2认同)