我在超类的自初始化实例中有条件导入,但是子类无法看到模块(python 2.7):
class A(object):
def __init__(self, arg1):
self.attr1 = self.method1(arg1)
def method1(self, arg1):
if arg1 == 'foo':
import amodule
return amodule.method1()
else:
return 'not a dependency on foo'
class B(A):
def __init__(self, arg1):
super(B, self).__init__(arg1)
if arg1 == 'foo':
self.attr2 = self.method2(self.attr1)
def method2(self, attr1):
return amodule.method2()
if __name__=='__main__':
b = B("foo")
print b.attr2
这会引发NameError: global name 'amodule' is not defined
。 a = A("foo")
工作得很好
在这种情况下,super
来电不应该执行import amodule
吗? (使用import
应该将模块放入全局变量?)
答案 0 :(得分:2)
不会将add / amodule /导入到当前的全局命名空间 执行模块? (
__main__
)?
不,该模块已添加到sys.modules
但如果它是在本地导入的,那么您将不再对它进行任何引用。即名称amodule
现已消失。
您仍然可以使用sys.modules
访问该模块:
def method2(self, attr1):
import sys
return sys.modules['amodule'].method2()
或者您可以再次使用import amodule
导入它,它将从sys.modules
中获取。
# Here b.py contains
# print('Module b was imported')
def func1():
print('inside func1')
import b
def func2():
print('inside func2')
import sys
print(sys.modules['b'])
import b
def func3():
print('inside func3')
import b
import sys
print('Deleted b')
del sys.modules['b']
import b
func1()
print()
func2()
print()
func3()
<强>演示:强>
inside func1
Module b was imported
inside func2
<module 'b' from '/Users/ashwini/py/b.py'>
inside func3
Deleted b
Module b was imported
答案 1 :(得分:0)
尝试将import amodule
放在程序的第一行。
原因是在方法1中导入了模块,方法2没有访问权限。
答案 2 :(得分:0)
如果你按照你的代码,你会发现你没有达到method1()。
创建对象时
b = B(foo)
你通过A. init ()来调用super()。但是,类A()
的init不包含任何import语句。然后A.__init__
部分完成,您继续B.__init__()
。下一个命令是对amodule对象的调用,该对象根本没有导入。
您可以添加一个辅助方法,检查arg是否等于'Foo',如果是,则导入模块。然后在A.__init__()
函数中添加对此函数的调用。
另一方面,__init__()
工作是初始化变量。它不应该返回任何东西。