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 № 1o __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.