2014-11-03 65 views
0

我想从两个基类(ExampleTestRun和Thread)动态创建一个类。主要目的是在线程中启动ExampleTestRun方法“run”(通过调用Thread类的方法“start”)。我从来没有在Python中使用super()。也许这将是一个答案?如何在Python中动态类创建后调用父类的__init__方法?

from threading import Thread 

class BaseTest(object): 
    def __init__(self): 
     pass 

class ExampleTestRun(BaseTest): 

    def run(self): 

     try: 
      a = int('A') 
     except Exception as ex: 
      print ex 



if __name__ == "__main__": 

    test_class = type('TestClass', (ExampleTestRun, Thread), {}) 
    test = test_class() 
    test.start() 

我得到错误:

Traceback (most recent call last): 
    File "D:/Dropbox/Workspaces/PyCharmWorkspace/ElgsisTests/src/mcltests/mcltransparent/run.py", line 30, in <module> 
    test.start() 
    File "C:\Python27\lib\threading.py", line 737, in start 
    raise RuntimeError("thread.__init__() not called") 
RuntimeError: thread.__init__() not called 
+3

为什么要定义一个空的'__init__'方法? – BrenBarn 2014-11-03 08:00:57

+0

BrenBarn:在BaseTest中? – kepurlaukis 2014-11-03 08:16:03

+0

是的。如果你只是删除它,它会正常工作。 – BrenBarn 2014-11-03 18:42:42

回答

1

它监守你​​将覆盖新创建的类的__init__抛出错误。更换该重新定义与pass干脆将修复它:

class BaseTest(object): 
    pass 

当然,如果你想在原来的构造函数展开,你将不得不诉诸super。因此,完整的代码将如下所示:

from threading import Thread 

class BaseTest(object): 
    def __init__(self): 
     super(BaseTest, self).__init__() 

class ExampleTestRun(BaseTest): 

    def run(self): 

     try: 
      a = int('A') 
     except Exception as ex: 
      print ex 

if __name__ == "__main__": 

    test_class = type('TestClass', (ExampleTestRun, Thread), {}) 
    test = test_class() 
    test.start() 
+0

正如我所说 - 我从来没有使用超级之前,所以不熟悉它的行为,并不知道使用超级或在ChildClass __init__方法中简单地调用ParentClass .__ init __(self)方法之间的区别。谢谢! – kepurlaukis 2014-11-03 08:23:56

相关问题