有人能解释一下这种意外的Python导入行为吗?

有人能解释一下这种意外的Python导入行为吗?,python,import,Python,Import,我遇到了Python 2.6.1中的一些行为,这是我没有预料到的。下面是一些简单的代码来重现问题: ---- ControlPointValue.py ------ class ControlPointValue: def __init__(self): pass ---- ControlPointValueSet.py ---- import ControlPointValue ---- main.py -------------------- from ControlP

我遇到了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
回溯(最近一次呼叫最后一次):
文件“main.py”,第4行,在
val=控制点值()
TypeError:“模块”对象不可调用
有人能解释一下这是怎么回事吗?Python是否因为类名与文件名相同而感到困惑?如果是,解决问题的最佳方法是什么?(我更喜欢以python文件中定义的类命名)

谢谢,
杰里米

我认为这并不意外。你基本上在做的是:

1) main.py中的第一个导入将ControlPointValue模块的内容导入到全局命名空间中。这将生成一个绑定到该名称的类

2) main.py中的第二个导入将ControlPointValueSet模块的内容导入到全局命名空间中。此模块导入ControlPointValue模块。这将覆盖全局命名空间中的绑定,替换该名称从类到模块的绑定

为了解决这个问题,我建议您永远不要导入*。始终保留最后一个模块前缀。例如,如果foo/bar/baz/bruf.py包含一个类Frobniz,那么

from foo.bar.baz import bruf

然后使用bruf.Frobniz()

除了关于星型导入的其他建议外,不要将模块和类命名为相同的名称。按照下面的步骤,给你的模块加上所有小写的名字,然后像这样给你的类命名。例如

---- 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()

我没想到……:)谢谢你的解释,这很有道理。我的意思是,这不是一个bug。这是一个特色,是的。然而,“导入*”有时是合理的:例如,当你有很多公式时,“从数学导入*”是有意义的。
---- 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()