同じディレクトリにいくつかの 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 環境でうまくいく場合は、私に知らせてください。