【问题标题】:Why can't I use my Jython class in an imported module?为什么我不能在导入的模块中使用我的 Jython 类?
【发布时间】:2010-10-10 05:26:27
【问题描述】:

我有几个 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__'

我在这里做错了什么?为什么此代码在定义我的类的模块中有效,但在我将该类导入另一个模块时无效? (我用“import modulename”而不是“from modulename import MyTask”来导入它)

编辑:对于那些认为问题在于 Runnable 是一个接口因此没有构造函数的人:我知道这一点,但它并不能完全解释这种情况。问题的关键是我可以在定义它的模块中实例化这个类,但我不能将它导入另一个模块并在那里实例化它。即,

在我的任务模块中:

# 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,但事实并非如此。它运行得很好。

Edit #2:显然这在独立脚本中有效,但在我的 Eclipse/Pydev 环境中无效。所以真正的问题是为什么 Pydev 不让我这样做。如果这对他们自己的 Pydev/Eclipse 环境中的任何人都有效,请告诉我。

【问题讨论】:

    标签: java import module jython pydev


    【解决方案1】:

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

    【讨论】:

    • 好吧,就像我说的,我可以从模块中调用该代码,所以不可能这样。不确定 Jython 做了什么来使该代码有效,但我已经看到它在其他地方也使用过。
    【解决方案2】:

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

    jython 中还没有“inferface”。 “实现”通过继承来模拟。

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

    AttributeError:类 Runnable 没有属性“__init__”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-01
      • 2021-10-20
      • 2015-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-23
      • 2021-05-07
      相关资源
      最近更新 更多