为什么我不能在导入的模块中使用我的Jython类?

时间:2009-02-26 23:29:17

标签: java import module jython pydev

我有几个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()时,我收到以下错误:

可运行.__初始化__(个体) 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()

在other_module中:

# 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不允许我这样做。如果这对他们自己的Pydev / Eclipse环境中的任何人都有效,请告诉我。

2 个答案:

答案 0 :(得分:1)

__init__是jython(python)类的构造函数

在jython中还没有“界面”。 'implements'是通过继承模拟的。

如果基类是java中的接口,则不存在构造函数(无__init__) 你得到一个:

AttributeError: class Runnable has no attribute '__init__'

答案 1 :(得分:0)

Runnable是一个接口......所以它没有构造函数。我猜测__init__的调用是调用构造函数。