У меня есть пара модулей Jython, находящихся в одном каталоге. Один из них определяет следующий класс:
from java.lang import Runnable
class MyTask(Runnable):
def __init__(self, params):
Runnable.__init__(self)
self._params = params
def run(self):
# do stuff
print "Done doing stuff"
Я могу создать и запустить этот класс из его собственного модуля. Однако, когда я импортирую этот модуль в другой модуль Jython и пытаюсь создать экземпляр MyTask(), я получаю следующую ошибку:
Runnable.__init__(self) AttributeError: класс Runnable не имеет атрибута '__init__'
Что я здесь делаю неправильно? Почему этот код действителен в модуле, где определен мой класс, но не действует, когда я импортирую этот класс в другой модуль? (Я импортирую его с помощью «импортировать имя модуля», а не «из имени модуля импортировать MyTask»)
Редактировать: тем, кто предположил, что проблема в том, что Runnable является интерфейсом и, следовательно, не имеет конструктора: я знаю это, но это не полностью объясняет эту ситуацию. Суть вопроса в том, что я могу создать экземпляр этого класса в модуле, где он определен, но я не могу импортировать его в другой модуль и создать там экземпляр. то есть,
В mytask_module:
# this works
if __name__ == '__main__':
task = MyTask() # works!
thread = Thread(task)
thread.start()
В другом_модуле:
# this throws AttributeError
if __name__ == '__main__':
import mytask_module
task = mytask_module.MyTask() # raises AttributeError
thread = Thread(task)
thread.start()
Теперь вы видите путаницу? Если бы проблема была именно такой, как вы описали, то предыдущий пример также должен был бы вызвать AttributeError, но это не так. Он работает просто отлично.
Редактирование №2. По-видимому, это работает в автономном сценарии, но не в моей среде Eclipse/Pydev. Итак, главный вопрос в том, почему Пидев не позволяет мне это сделать. Если это работает для кого-то в их собственной среде Pydev/Eclipse, сообщите мне.