我遇到了Python 2.6.1的一些我没想到的行为。以下是重现问题的一些简单代码:
---- ControlPointValue.py ------
class ControlPointValue:
def __init__(self):
pass
---- ControlPointValueSet.py ----
import ControlPointValue
---- main.py --------------------
from ControlPointValue import *
from ControlPointValueSet import *
val = ControlPointValue()
....这是我运行main.py时遇到的错误(在OS / X Snow Leopard下,如果重要的话):
jeremy-friesners-mac-pro-3:~ jaf$ python main.py
Traceback (most recent call last):
File "main.py", line 4, in <module>
val = ControlPointValue()
TypeError: 'module' object is not callable
有人可以解释这里发生了什么吗? Python是否因为类名与文件名相同而感到困惑?如果是这样,解决问题的最佳方法是什么? (我更喜欢让我的python文件以它们中定义的类命名)
谢谢, 杰里米
答案 0 :(得分:11)
我不认为这是出乎意料的。你基本上做的是:
1)main.py中的第一个导入将ControlPointValue模块的内容导入全局命名空间。这会生成一个绑定到该名称的类。
2)main.py中的第二个导入将ControlPointValueSet模块的内容导入全局命名空间。此模块导入ControlPointValue模块。这将覆盖全局命名空间中的绑定,将该名称的绑定从类替换为模块。
要解决这个问题,我建议你不来导入*。始终保留最后一个模块前缀。例如,如果你有包含Frobniz类的foo / bar / baz / bruf.py,那么
from foo.bar.baz import bruf
然后使用bruf.Frobniz()
答案 1 :(得分:4)
除了有关星级导入的其他建议外,请不要将模块和类命名为相同。关注pep8's suggestions并为您的模块缩短所有小写名称并命名您的类LikeThis。 E.g。
---- controlpoints.py ------
class ControlPointValue:
def __init__(self):
pass
---- valuesets.py ----
from controlpoints import ControlPointValue
---- main.py --------------------
from controlpoints import ControlPointValue
from valuesets import *
val = ControlPointValue()