子类_​​_init__没有看到超类conditonally-imported模块

时间:2017-07-31 17:28:26

标签: python python-2.7 oop python-import super

我在超类的自初始化实例中有条件导入,但是子类无法看到模块(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 defineda = A("foo")工作得很好

在这种情况下,super来电不应该执行import amodule吗? (使用import应该将模块放入全局变量?)

3 个答案:

答案 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__()工作是初始化变量。它不应该返回任何东西。

相关问题