不同的导入会在Python中导入不同的类对象吗?

时间:2014-07-23 15:20:45

标签: python import

到目前为止,我通常将模块导入为

from quantumClasses.qcAbstract import QCAbstract

其中quantumClasses是PYTHONPATH路由中的文件夹。但如果我碰巧在同一条路径中的另一个模块中,而不是我可以做到

from qcAbstract import QCAbstract

它似乎是一样的,我从来没有太注意我使用的是哪一个。但现在我遇到了一个令人痛苦的案子。我在下面的玩具示例中简化了它。 Car是一个具有class属性的类。我有以前提到的方式导入它的函数,它们似乎访问不同的类。

考虑文件:

# car.py

class Car(object):
    attrib = 0


# tools1.py
from car import Car

def get1():
    return Car.attrib

def set1(val):
    Car.attrib = val


# tools2.py
from car import Car

def get2():
    return Car.attrib

def set2(val):
    Car.attrib = val


# tools3.py
from quantumClasses.car import Car

def get3():
    return Car.attrib

def set3(val):
    Car.attrib = val


# testCar.py
from tools1 import get1, set1
from tools2 import get2, set2
from tools3 import get3, set3


set1(10)
set3(5)
print(get1())
print(get3())
print(get2())

当我执行testCar.py时,我得到了

10
5
10

所以,似乎我正在处理两个不同的类quantumClasses.qcAbstract.QCAbstract 和qcAbstract.QCAbstract,虽然它们都是在同一个物理文件中定义的。

我做错了吗?避免这些尴尬局面的标准方法是什么?

编辑:应该已经指定,这是Python 2.7

1 个答案:

答案 0 :(得分:2)

我认为您导入的文件与两个不同的模块相同。 他们有两个不同的名字。

查看sys.modulescar.__name__quantumClasses.car.__name__应该不同。

这是因为您可以从两个不同的路径导入它们,可能是site-packages.。这样Python无法确定它是同一个文件。因为一个文件是site-packages/quantumClasses/car.py而另一个是./car.py

如果要将名称设置为某些名称

  1. 决定一次进口!通常这将是quantumClasses.car
  2. 可能但是meta而不推荐:import sys; sys.modules['quantumClasses.car'] = car