到目前为止,我通常将模块作为
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())
当我执行测试车.py,我明白了
10
5
10
所以,看起来我在处理两个不同的类quantumClasses.qcAbstract.qcAbstract类 以及qcAbstract.qcAbstract摘要,尽管它们都是在同一个物理文件中定义的。你知道吗
我做错什么了吗?避免这些尴尬局面的标准方法是什么?你知道吗
EDIT:应该指定,这是python2.7
我认为您将同一个文件作为两个不同的模块导入。 他们有两个不同的名字。你知道吗
看看
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
相关问题 更多 >
编程相关推荐