导入python模块的特殊性?

导入python模块的特殊性?,python,import,module,serial-port,pyserial,Python,Import,Module,Serial Port,Pyserial,我一直在使用python的PySerial库,但我似乎不明白为什么我必须专门导入模块的某个部分 这将给我一个错误: import serial for item in serial.tools.list_ports.comports(): print item 上面的代码段将返回“AttributeError:type对象'Serial'没有属性'tools'” 如果专门导入该属性,则不会出现错误: import serial.tools.list_ports for item in

我一直在使用python的PySerial库,但我似乎不明白为什么我必须专门导入模块的某个部分

这将给我一个错误:

import serial
for item in serial.tools.list_ports.comports():
    print item
上面的代码段将返回“AttributeError:type对象'Serial'没有属性'tools'”

如果专门导入该属性,则不会出现错误:

import serial.tools.list_ports
for item in serial.tools.list_ports.comports():
    print item
有人能帮我理解为什么第一次导入不会运行comports()方法吗


我知道将更少的项目导入内存是一种最佳实践,但我也在使用PySerial模块中的其他方法。导入串行和串行.tools.list_端口似乎是多余的。

导入
串行
将创建模块创建的所有名称。这听起来很明显,直到您意识到
serial
不会在其中创建任何称为“tools”的属性。这实际上是一个单独的模块

import
是否支持导入父模块,这就是为什么导入
serial.tools.list\u port
也会导入
serial.tools
。它也导入
serial
,但是您应该显式地导入它,而不是让Python意外地为您导入它

>>> import this
The Zen of Python, by Tim Peters

 ...
Explicit is better than implicit.
 ...