__init __()中的Python导入

时间:2012-11-15 10:01:18

标签: python python-import

我需要在__init__()方法中导入(因为我只需要在实例化时运行该导入)。

但是我看不到__init__()之外的导入,范围是否仅限于__init__?怎么办?

4 个答案:

答案 0 :(得分: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)>

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

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

class Foo(object):
    def __init__(self):
        import os
        self.join = os.path.join

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

答案 1 :(得分:4)

您可以在其他需要的地方再次导入它 - 它将在第一次之后缓存,因此相对便宜。

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

之类的内容修改当前的全局命名空间

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

答案 2 :(得分:4)

import语句使导入的名称仅对当前范围可用。 import foo内的__init__会创建一个foo,只能在__init__方法中看到。

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

class Wayne(object):
    def __init__(self):
        global foo
        import foo

答案 3 :(得分:2)

如果您希望导入的结果对该类的其他对象可见,则需要将导入的结果对象分配给类或实例变量

例如:

>>> class Foo(object):
...    def __init__(self):
...       import math
...       self.bar = math.pi
...    def zoo(self):
...       return self.bar
... 
>>> a = Foo()
>>> a.zoo()
3.141592653589793