【问题标题】:Does importing a class from another file also import that files dependencies?从另一个文件导入一个类是否也会导入该文件的依赖项?
【发布时间】:2018-05-29 21:08:55
【问题描述】:

假设我有一个名为 src.py 的脚本,其中定义了几个函数;这些函数都在一个名为LDA 的类中。这些函数需要numpyscipy等库,在脚本顶部作为标准导入。

现在在一个名为 main.py 的新单独脚本中,我导入了 LDA 类:

from src import LDA

如果我现在在新的main.py 脚本中使用LDA 类及其所有函数,则这些函数都可以正常工作,即使我没有导入src.py 中所需的依赖项 . 这是如何工作的?我不应该在main.py 中导入numpyscipy 等,以使LDA 工作吗?

【问题讨论】:

    标签: python import dependencies


    【解决方案1】:

    此问题和类似问题已在此处得到解答。请参阅thisthis 以了解python import modulefrom module import class 功能的重要性。

    总而言之,import Xfrom 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。

    【讨论】:

      猜你喜欢
      • 2021-03-21
      • 2021-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-14
      相关资源
      最近更新 更多