2009-02-26 25 views
1

Aynı dizinde yaşayan birkaç Jython modemi var.Neden Jython sınıfımı içe aktarılmış bir modülde kullanamıyorum?

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" 

Ben örneğini kendi modülü içinde sadece ince bu sınıfı çalıştırabilirsiniz: Bunlardan biri şu sınıfını tanımlar. Ancak, farklı bir Jython modülünün içine modülü almak ve MyTask() örneğini çalıştığınızda, aşağıdaki hatayı alıyorum:

Runnable .__ init __ (self) AttributeError: Sınıf Runnable hiçbir özellik '__init__' vardır

Burada yanlış olan ne yapıyorum? Bu kod neden sınıfımın tanımlandığı modülde geçerli, ancak bu sınıfı başka bir modüle içe aktardığımda geçerli değil? O To sorun Runnable bir arayüz olduğunu ve bu nedenle hiçbir yapıcı olmasıdır ileri sürmüşlerdir:

Düzenleme (I "modulename ithalat MyTask gelen" diğerlerinden ziyade "ithal modulename" ile aktarıyorum) Ben Bunu biliyorum ama bu durumu tam olarak açıklamıyor. Sorunun en önemli noktası, 'un numaralı telefonun tanımlanabildiği modüldeki bu sınıfı başlatmasıdır, ancak ,'u başka bir modüle içe aktaramaz ve orada başlatır. yani mytask_module olarak

: other_module olarak

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

:

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

Şimdi karışıklık görüyorsunuz? Sorun sadece anlattığınız gibi olsaydı, önceki örnekte ayrıca bir AttributeError öğesi de yükseltilmeli, ancak değil. Sadece iyi çalışıyor.

# Düzenle # 2: Görünüşe göre bu, bağımsız bir komut dosyasında çalışıyor, ancak Eclipse/Pydev ortamımda değil. Yani asıl soru, neden Pydev'in bunu yapmama izin vermesidir. Bu kendi Pydev/Eclipse ortamında herkes için çalışıyorsa, lütfen bana bildirin.

cevap

0

Runnable bir arabirimdir ... bu yüzden kurucusu yoktur. __init__ çağrısının yapıcıyı çağırmak olduğunu tahmin ediyorum. __init__

+0

Eh, ben modül içinden bu kodu çağırabilirsiniz: taban sınıfı java bir arabirim ise

, hiçbir yapıcı (hayır __init__) mevcut ve bir olsun Bu olamaz. Jython'un bu kodu geçerli kılmak için yaptıklarından emin değilim, ancak başka yerlerde de kullandığını gördüm. – Jeff

1

Jython içinde hayır 'inferface' henüz yoktur jython (piton) yapıcısı sınıfı

olduğunu. 'implements' kalıtım yoluyla emüle edilir. böylece, dediğim gibi

 
AttributeError: class Runnable has no attribute '__init__'