/ / Por que não consigo usar minha classe Jython em um módulo importado? - java, importação, módulo, jython, pydev

Por que não consigo usar minha classe Jython em um módulo importado? - java, importação, módulo, jython, pydev

Eu tenho alguns módulos Jython vivendo no mesmo diretório. Um deles define a seguinte classe:

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"

Eu posso instanciar e executar esta classe muito bemde dentro de seu próprio módulo. No entanto, quando importo esse módulo para um módulo Jython diferente e tento instanciar MyTask (), recebo o seguinte erro:

Executável .__ init __ (próprio) AttributeError: classe Runnable não tem atributo "__init__"

O que eu estou fazendo errado aqui? Por que esse código é válido no módulo em que minha classe está definida, mas não quando importo essa classe para outro módulo? (Estou importando-o com "import modulename" em vez de "from modulename import MyTask")

Editar: Para aqueles que sugeriram que o problema éque Runnable é uma interface e, portanto, não tem construtor: eu sei disso, mas não explica completamente essa situação. O cerne da questão é que eu posso instanciar essa classe dentro do módulo em que está definida, mas eu não podes importe-o para outro módulo e instancie-o lá. ou seja,

No mytask_module:

# this works
if __name__ == "__main__":
task = MyTask() # works!
thread = Thread(task)
thread.start()

Em other_module:

# this throws AttributeError
if __name__ == "__main__":
import mytask_module
task = mytask_module.MyTask() # raises AttributeError
thread = Thread(task)
thread.start()

Agora você vê a confusão? Se o problema foi puramente como você estava descrevendo, o exemplo anterior também deve gerar um AttributeError, mas isso não ocorre. Funciona muito bem.

Editar # 2: Aparentemente, isso funciona de maneira independentescript, mas não no meu ambiente Eclipse / Pydev. Portanto, a verdadeira questão é por que o Pydev não me permite fazer isso. Se isso funcionar para qualquer pessoa em seu próprio ambiente Pydev / Eclipse, informe-me.

Respostas:

1 para resposta № 1

o __init__ é o construtor da classe jython (python)

ainda não há "inferface" em jython. os "implementos" são emulados por herança.

se a classe base é uma interface em java, não existe construtor (nenhum __init__) e você obtém um:

AttributeError: classe Runnable não tem atributo "__init__"

0 para resposta № 2

Runnable é uma interface ... por isso não tem construtor. Acho que a chamada para __init__ é chamar o construtor.