我需要在__init__()
方法中导入(因为我只需要在实例化类时运行该导入)。
但我看不到外面__init__()
的进口,范围仅限于__init__
吗?怎么做?
我需要在__init__()
方法中导入(因为我只需要在实例化类时运行该导入)。
但我看不到外面__init__()
的进口,范围仅限于__init__
吗?怎么做?
导入的名称绑定到当前范围,因此函数内的导入仅绑定到本地名称。
如果您绝对必须导入某些__init__
内容,那么需要全局可用,请将导入的名称标记为global
first:
>>> 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
但同样,这不是最好的做法。
您可以在需要它的其他地方再次导入它——它将在第一次之后被缓存,因此相对便宜。
或者,您可以使用类似globals()['name'] = local_imported_module_name
.
编辑:作为记录,虽然使用该globals()
函数肯定会起作用,但我认为“更清洁”的解决方案是声明模块的名称global
,然后声明import
它,正如其他几个答案所提到的那样。
该import
语句使导入的名称仅可用于当前范围。你的import foo
内部__init__
创建了一个foo
只在__init__
方法中可见的。
您可以添加import foo
到任何需要访问模块的方法,或者如果您发现自己重新编写导入,则使用global
关键字将其导入模块范围。
class Wayne(object):
def __init__(self):
global foo
import foo
如果您希望导入的结果对类的其他对象可见,则需要将导入的结果对象分配给类或实例变量
例如:
>>> class Foo(object):
... def __init__(self):
... import math
... self.bar = math.pi
... def zoo(self):
... return self.bar
...
>>> a = Foo()
>>> a.zoo()
3.141592653589793