2014-11-03 1 views
0

Я хочу динамически создавать класс из двух базовых классов (ExampleTestRun и Thread). Основной целью этого является запуск метода ExampleTestRun «run» в потоке (путем вызова метода класса «start»). Я никогда не использовал super() в Python. Может быть, с этим будет ответ?Как вызвать метод __init__ родительского класса после создания динамического класса в Python?

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

+0

BrenBarn: В BaseTest? – kepurlaukis

+0

Да. Если вы просто удалите это, он будет работать нормально. – BrenBarn

ответ

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

Как я уже сказал, я никогда раньше не использовал супер, поэтому не знал его поведения и не знал разницы между использованием супер или просто вызовом метода ParentClass .__ init __ (self) в методе ChildClass __init__. Спасибо! – kepurlaukis