__init __()中的Python导入

tap*_*123 7 python python-import

我需要一个import __init__()方法(因为我只需要在实例化时运行该导入).

但是我看不到外面的导入__init__(),范围是否有限__init__?怎么做?

Mar*_*ers 9

导入的名称绑定到当前作用域,因此函数内的导入仅绑定到本地名称.

如果您必须导入__init__其中的内容然后需要全局可用,请将导入的名称标记为global第一个:

>>> def foo():
...     global sys
...     import sys
... 
>>> sys
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'sys' is not defined
>>> foo()
>>> sys
<module 'sys' (built-in)>
Run Code Online (Sandbox Code Playgroud)

但这通常会导致奇怪而且非常难以找到错误.不要这样做,只需在模块范围内进行导入即可.

如果在其他类方法中需要导入的名称,还可以将导入的名称分配给实例变量:

class Foo(object):
    def __init__(self):
        import os
        self.join = os.path.join
Run Code Online (Sandbox Code Playgroud)

但同样,这不是最好的做法.

  • 自己的模块是不可能的,因为 dir() 太模糊了,而且有很多东西需要验证(并且可能会破坏代码)。在顶层也是不可能的,因为一些类需要大模块,如 sqlite、tkinter、minidom 等,我们不想在模块导入时导入它们,根据我们的类只导入它们的一个子集要求。 (2认同)

mar*_*eau 5

您可以在其他需要它的地方再次导入它——它会在第一次之后被缓存,所以这相对便宜。

或者,您可以使用类似globals()['name'] = local_imported_module_name.

编辑:作为记录,虽然使用该globals()函数肯定会起作用,但我认为“更清洁”的解决方案是先声明模块的名称global,然后再声明import它,正如其他几个答案所提到的。

  • `再次导入`是正确的解决方案。它是免费的,因为模块导入全局缓存在 `sys.modules` 中。 (3认同)

bik*_*der 5

import语句使导入的名称仅可用于当前范围。import foo你的内部__init__创建了一个仅foo__init__方法内可见的。

您可以将 添加import foo到需要访问模块的任何方法,或者如果您发现自己重新编写导入,请使用global关键字将其导入到模块范围。

class Wayne(object):
    def __init__(self):
        global foo
        import foo
Run Code Online (Sandbox Code Playgroud)