1

同じディレクトリにいくつかの Jython モジュールがあります。それらの 1 つは、次のクラスを定義します。

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__' がありません

ここで何が間違っていますか?このコードは、クラスが定義されているモジュール内では有効ですが、そのクラスを別のモジュールにインポートすると有効でないのはなぜですか? (「from modulename import MyTask」ではなく「import modulename」でインポートしています)

編集: 問題は 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 環境でうまくいく場合は、私に知らせてください。

4

2 に答える 2

1

これ__init__は、jython(python) クラスのコンストラクターです。

jython にはまだ 'inferface' がありません。「implements」は継承によってエミュレートされます。

基本クラスが Java のインターフェースである場合、コンストラクターは存在せず (no __init__)、次のようになります。

AttributeError: クラス Runnable に属性 '__init__' がありません
于 2009-02-27T15:03:22.637 に答える
0

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

于 2009-02-26T23:33:30.873 に答える