2017-04-12 61 views
0

我正在使用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

你的代理模块导入两次 - 一次为__main__(当您运行python Proxy.py时)和一次为Proxy(当它由Crunner导入时)。

解决方法很简单:守卫调用Crunner()所以当Proxy作为脚本它只是执行:

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

再次感谢@bruno desthuilliers为迅速解决和澄清。 –

相关问题