Почему я не могу использовать свой класс Jython в импортированном модуле? - PullRequest
1 голос
/ 27 февраля 2009

У меня есть пара модулей 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 (Я) AttributeError: класс Runnable не имеет атрибута __init __

Что я здесь не так делаю? Почему этот код действителен в модуле, где определен мой класс, а не при импорте этого класса в другой модуль? (Я импортирую его с помощью «import modulename», а не «from modulename import 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, пожалуйста, дайте мне знать.

Ответы [ 2 ]

1 голос
/ 27 февраля 2009

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

в jython пока нет «нижнего края». «инструменты» эмулируется наследованием.

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

AttributeError: class Runnable has no attribute '__init__'
0 голосов
/ 27 февраля 2009

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

...