代码之家  ›  专栏  ›  技术社区  ›  Jeff

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

  •  1
  • Jeff  · 技术社区  · 17 年前

    我有几个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:class Runnable没有属性“_init__”

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

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

    在mytask_模块中:

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

    2 回复  |  直到 17 年前
        1
  •  1
  •   Michael Myers KitsuneYMG    17 年前

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

    jython还没有“地狱脸”。 “实现”是通过继承来模拟的。

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

    AttributeError: class Runnable has no attribute '__init__'
    
        2
  •  0
  •   TofuBeer    17 年前

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