2009-02-26 12 views
1

Ich habe ein paar Jython-Module im selben Verzeichnis. Einer von ihnen definiert die folgende Klasse:Warum kann ich meine Jython-Klasse nicht in einem importierten Modul verwenden?

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" 

Ich kann diese Klasse in Ordnung in diesem eigenen Modul ausführen und ausführen. Allerdings, wenn ich importieren das Modul in ein anderes Jython Modul und versuchen MyTask() zu instanziiert, erhalte ich folgende Fehlermeldung:

Runnable .__ init __ (self) Attribute: Klasse Runnable hat kein Attribut '__init__'

Was mache ich hier falsch? Warum ist dieser Code innerhalb des Moduls gültig, in dem meine Klasse definiert ist, aber nicht, wenn ich diese Klasse in ein anderes Modul importiere? (Ich bin der Import mit „Import modul“ anstatt mit „von modul Import MyTask“)

bearbeiten: Für diejenigen, die vorgeschlagen haben, dass das Problem ist, dass Runnable eine Schnittstelle und hat daher keinen Konstruktor: I weiß das, aber es erklärt diese Situation nicht vollständig. Der Kernpunkt der Frage ist, dass ich kann instanziieren diese Klasse innerhalb des Moduls, wo es definiert ist, aber ich kann nicht importieren Sie es in ein anderes Modul und instanziieren es dort. das heißt

In mytask_module:

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

In other_module:

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

Jetzt sehen Sie die Verwirrung? Wenn das Problem so war, wie Sie es beschrieben haben, dann sollte das vorherige Beispiel auch einen AttributeError auslösen, tut es aber nicht. Es läuft gut.

Bearbeiten # 2: Anscheinend funktioniert das in einem eigenständigen Skript, aber nicht in meiner Eclipse/Pydev-Umgebung. Die wirkliche Frage ist also, warum ließ mich Pydev das nicht tun. Wenn dies für jeden in seiner eigenen Pydev/Eclipse-Umgebung funktioniert, lass es mich wissen.

Antwort

0

Runnable ist eine Schnittstelle ... also hat es keinen Konstruktor. Ich vermute, der Aufruf von __init__ heißt den Konstruktor aufzurufen.

+0

Nun, wie ich schon sagte, kann ich von innerhalb des Moduls, dass Code aufrufen, so das kann nicht sein. Ich bin mir nicht sicher, was Jython macht, um diesen Code gültig zu machen, aber ich habe gesehen, dass er auch anderswo verwendet wird. – Jeff

1

Der __init__ ist der Konstruktor der jython (Python) Klasse

gibt es noch keine 'inferface' in jython. die 'implementiert' wird durch Vererbung emuliert.

wenn die Basisklasse eine Schnittstelle in Java ist, gibt es keinen Konstruktor (kein __init__) und Sie bekommen ein:

 
AttributeError: class Runnable has no attribute '__init__'