从同一个模块动态实例化类会导致main运行twi

2024-03-29 10:05:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个名为dynamic_cls_ex.py的模块和两个名为FooButtonBarButton的类。我使用下面的代码从字符串中动态实例化我感兴趣的类。在

问题:我使用__import__导入模块,这会导致main运行两次。这是我的基本理解。请随时给我一个更好的解释

# !/usr/bin/python

class FooButton(object):
    def __init__(self):
        print 'I am a foo button'

class BarButton(object):
    def __init__(self):
        print 'I am a bar button'


method = 'Foo'
class_name = '%sButton' % method
module = __import__('dynamic_cls_ex')
Button = getattr(module, class_name)
Button()


# OUTPUT:
# >> I am a foo button
# >> I am a foo button

如何在不需要导入当前运行的模块的情况下动态实例化一个类?


Tags: 模块实例importobjectfoodef动态button
3条回答

if __name__ == '__main__'添加保护并将位于全局范围内的代码置于全局范围内可防止代码运行两次。在

当我运行以下代码时:

print __name__
module = __import__('dynamic_cls_ex')

# I get:
# >> __main__
# >> dynamic_cls_ex

所以我修改了代码,让它有一个类似于上面代码片段的保护器,我得到了下面的输出,它演示了这个保护器为什么起作用,并且我没有得到更多的重复项。在

^{pr2}$

好吧,您没有指定dynamic_cls_ex.py中的内容,但是我假设它有一些实际运行的顶级代码(我想这就是您所说的main函数)。在

每当它的封闭python文件本身在解释器的顶层运行时,或者当它被导入时(使用^{}您显式地绕过了不重新加载已经存在的模块的检查)时,就会运行该代码。在

但是您可以通过检查^{}“这个模块代表解释器主程序执行的(否则是匿名的)作用域”来强制代码只在顶层运行时运行。因此,如果您将顶层代码包装在if __name__ == "__main__":中,它将只从主程序运行,而不会在导入时运行。在

另请参见What does ^{} do?这里的SO。在

您可以使用globals()函数获取具有全局名称绑定的字典。然后你就可以访问这本字典来获取你的课程。在

相关问题 更多 >