Почему я не могу использовать свой класс Jython в импортированном модуле?

У меня есть пара модулей 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, сообщите мне.


person Jeff    schedule 26.02.2009    source источник


Ответы (2)


__init__ является конструктором класса jython (python).

в jython еще нет «интерфейса». «орудия» эмулируются по наследству.

если базовый класс является интерфейсом в java, конструктора не существует (нет __init__), и вы получаете:

AttributeError: class Runnable has no attribute '__init__'
person Blauohr    schedule 27.02.2009

Runnable - это интерфейс... поэтому у него нет конструктора. Я предполагаю, что вызов __init__ должен вызвать конструктор.

person TofuBeer    schedule 26.02.2009
comment
Ну, как я уже сказал, я могу вызвать этот код из модуля, так что это не может быть так. Не уверен, что Jython делает, чтобы сделать этот код действительным, но я видел, как он использовался и в других местах. - person Jeff; 27.02.2009