到目前为止,我通常将模块导入为
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
答案 0 :(得分:2)
我认为您导入的文件与两个不同的模块相同。 他们有两个不同的名字。
查看sys.modules
。 car.__name__
和quantumClasses.car.__name__
应该不同。
这是因为您可以从两个不同的路径导入它们,可能是site-packages
和.
。这样Python无法确定它是同一个文件。因为一个文件是site-packages/quantumClasses/car.py
而另一个是./car.py
。
如果要将名称设置为某些名称
quantumClasses.car
import sys; sys.modules['quantumClasses.car'] = car