此问题和类似问题已在此处得到解答。请参阅this 和this 以了解python import module 和from module import class 功能的重要性。
总而言之,import X 和from X import class 都会逐行执行目标文件,因此所有依赖项都会自动加载到模块的命名空间中。因此,如果您实例化该类并运行函数/方法,它们将在 X 的命名空间(一个花哨的字典)中查找,其中存在对依赖项的引用。 from X import class 会在导入后创建一个对 class 的同名引用,因此无需限定即可使用。但需要注意的是模块 X 没有引用,因此无法使用 X.obj 限定符访问对象。使用普通的import X 语句,您可以访问 X 中定义的所有对象。
旁注:导入对象的 dir() 函数和 dict 属性是查看加载了哪些对象的好方法。下面给出一个例子
#script test.py
import numpy as np
class Baz():
def __init__(self, num):
self.a = np.arange(num)
self.b = np.ones(num)
print self.a, self.b
def foo(self):
prod = np.dot(self.a, self.b)
return prod
>>> import test
>>> dir(test)
['Baz', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'np']
>>> test.__dict__.keys()
['__builtins__', '__file__', 'Baz', '__package__', 'np', '__name__', '__doc__']
>>> test.__dict__['np']
<module 'numpy' from '/home/user/bin/python2.7/site-packages/numpy/__init__.pyc'>
>>> x = test.Baz(5)
[0 1 2 3 4] [ 1. 1. 1. 1. 1.]
>>> x.foo()
10.0
现在是 from import 语句
>>> from test import Baz
>>> dir(test)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'test' is not defined
>>> dir(Baz)
['__doc__', '__init__', '__module__', 'foo']
>>> Baz.__module__
'test'
>>> Baz.__dict__.keys()
['__module__', 'foo', '__doc__', '__init__']
>>> x = Baz(5)
[0 1 2 3 4] [ 1. 1. 1. 1. 1.]
>>> x.foo()
10.0
>>> Baz.__dict__['foo'].__globals__.keys()
['__builtins__', '__file__', 'Baz', '__package__', 'np', '__name__', '__doc__']
如您所见,模块 numpy 已加载并可在函数的 __globals__ 属性中使用,该属性再次返回所有已加载模块的字典。因此,当foo() 方法运行时,它会在命名空间字典中查找并定位numpy。