在动态实例化类

时间:2017-04-12 10:07:28

标签: python

我正在使用importlib& getattr动态创建类的实例。但是,当我运行下面提供的Proxy.py时,构造函数被调用两次,我得到重复的结果。提前致谢。 (Python 3.6.1)

结果

inside Cproxy contructor
inside Cproxy read()
inside Cproxy contructor
inside Cproxy read()

Runner.py

import importlib
class Crunner:
    def __init__(self, nameofmodule, nameofclass):        
        self.run(nameofmodule, nameofclass)

    def run(self, nameofmodule, nameofclass):
        module = importlib.import_module(nameofmodule)            
        class_ = getattr(module, nameofclass)
        instance = class_()
        instance.read()

Proxy.py

from Runner import Crunner
class Cproxy:
    def __init__(self):
        print("inside Cproxy contructor")    
    def read():
        print("inside Cproxy read()")


Crunner("Proxy", "Cproxy")

1 个答案:

答案 0 :(得分:1)

您的代理模块已导入两次 - 一次为__main__(当您运行python Proxy.py时),一次为Proxy(当Crunner导入时)

解决方案很简单:保护对Crunner()的调用,以便仅在Proxy用作脚本时执行:

if __name__ == "__main__":
    Crunner("Proxy", "Cproxy")