2009-02-26 6 views
1

私は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 __(自己) はAttributeError:クラスのRunnableは何の属性 '__init__' がありません

私はここで何が間違っていますか?なぜこのコードは、私のクラスが定義されているモジュール内で有効ですが、そのクラスを他のモジュールにインポートすると有効ではありません。編集

を(私は、「モジュール名インポートMyTaskにから」「インポートモジュール名」ではなくて、それをインポートしています):I:問題はRunnableをインターフェイスであるため、コンストラクタを持っていないということであることを示唆している人にこれを知っているが、この状況を完全には説明していない。問題の要点は、が定義されているモジュール内でこのクラスをインスタンス化しますが、を別のモジュールにインポートしてインスタンス化できないということです。すなわち、mytask_moduleで

:other_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が私にこれをさせないのかということです。これが自分自身のPydev/Eclipse環境の人にとってはうまくいくなら、私に教えてください。

答えて

0

Runnableはインタフェースなのでコンストラクタはありません。私は__init__への呼び出しがコンストラクタを呼び出すことを推測しています。 __init__

+0

まあ、私はそう、モジュール内からそのコードを呼び出すことができ、言ったようにそれはできません。 Jythonがそのコードを有効にするために何をしているのかはっきりしていませんが、他の場所でも使用されています。 – Jeff

1

はJythonのには 'inferface' がまだ存在しないのJython(パイソン)のコンストラクタクラス

あります。 'implements'は継承によってエミュレートされます。

基底クラスは、Javaのインターフェイスであれば、何のコンストラクタは (無__init__)に存在しないとあなたが得る:

 
AttributeError: class Runnable has no attribute '__init__' 
関連する問題