我正在尝试导入一个模块,但只有在调用特定类的对象时才会这样。例如:
class One(object):
try:
import OneHelper
except ImportError:
pass
def __init__(self):
# this function doesn't use OneHelper
...
def blah(self):
# this function does
OneHelper.blah()
当调用NameError: global name 'OneHelper' is not defined
函数时,这会导致One.blah()
。到目前为止,我发现唯一有效的方法是将模块导入到使用它的实际函数中。所以:
class One(object):
def __init__(self):
# this function doesn't use OneHelper
...
def blah(self):
try:
import OneHelper
except ImportError:
pass
# this function does
OneHelper.blah()
但是我不想在我想要使用的每个函数中导入模块,我希望它可以用于整个类,但只有如果是一个实例class被实例化。如果我不够清楚,请道歉......
答案 0 :(得分:8)
import OneHelper
在类中工作正常,使其成为类属性。您可以在定义课程后使用dir(One)
验证这一点 - 这是您的OneHelper
属性。 One.OneHelper
是对模块的引用。当然,在一个实例中,您可以从方法中将其作为self.OneHelper
访问。 (您也可以继续以One.OneHelper
的形式访问它。)
答案 1 :(得分:2)
将其导入__init__
并将其归属于某个属性:
class One(object):
def __init__(self):
try:
import OneHelper
except ImportError:
self.OneHelper = None
else:
self.OneHelper = OneHelper
def blah(self):
if self.OneHelper:
self.OneHelper.blah()
您的示例看起来很有趣,因为如果模块无法导入,以后调用它的重点是什么?
答案 2 :(得分:0)
在导入模块之前,您还可以考虑使用global OneHelper
。这将OneHelper添加到全局命名空间。