2012-07-27 18 views
31

Ho una classe MyThread. In questo ho un esempio di metodo. Sto provando a farlo funzionare con lo stesso contesto dell'oggetto. Si prega di dare un'occhiata al codice:Python AttributeError: L'oggetto non ha attributo

class myThread (threading.Thread): 
    def __init__(self, threadID, name, counter, redisOpsObj): 
     threading.Thread.__init__(self) 
     self.threadID = threadID 
     self.name = name 
     self.counter = counter 
     self.redisOpsObj = redisOpsObj 

    def stop(self): 
     self.kill_received = True 

    def sample(self): 
     print "Hello" 

    def run(self): 
     time.sleep(0.1) 
     print "\n Starting " + self.name 
     self.sample() 

Sembra molto semplice, non è vero? Ma quando lo eseguo ottengo questo errore

AttributeError: 'myThread' object has no attribute 'sample' Ora ho quel metodo, proprio lì. Quindi cosa c'è che non va? Si prega di aiutare

Edit: Questo è lo stacktrace

Starting Thread-0 

Starting Thread-1 
Exception in thread Thread-0: 
Traceback (most recent call last): 
File "/usr/lib/python2.6/threading.py", line 525, in __bootstrap_inner 
self.run() 
File "./redisQueueProcessor.py", line 51, in run 
self.sample() 
AttributeError: 'myThread' object has no attribute 'sample' 

Exception in thread Thread-1: 
Traceback (most recent call last): 
File "/usr/lib/python2.6/threading.py", line 525, in __bootstrap_inner 
self.run() 
File "./redisQueueProcessor.py", line 51, in run 
self.sample() 
AttributeError: 'myThread' object has no attribute 'sample' 

Chiedo come questo

arThreads = [] 
maxThreads = 2; 

for i in range(maxThreads): 
    redisOpsObj = redisOps() 
    arThreads.append(myThread(i, "Thread-"+str(i), 10, redisOpsObj)) 

Mi dispiace non posso inviare redisOps codice della classe. Ma posso assicurarti che funziona perfettamente

+0

Pubblicherebbe l'errore completo con il callstack? – sloth

+0

potresti aggiungere il codice come stai chiamando? – Babu

+2

C'è del codice mancante. Questo frammento funziona per me. – ThirdOne

risposta

59

Il tuo rientro è ingannevole e hai schede e spazi misti. Esegui lo script con python -tt per verificare.

+0

Grazie per l'apertura degli occhi. Ho capito adesso. Scusa per la domanda stupida e la spiegazione troppo lunga di una tale domanda;) – Shades88

+10

wow non sapevo '-tt' – n611x007

+0

Questi tipi di bug sono comuni quando Python multi-threading. Quello che succede è che, in caso di abbreviazione dell'interprete, il modulo pertinente (myThread in questo caso) passa attraverso una sorta di 'del mioThread'. – Trevor

5

Questi tipi di bug sono comuni quando Python multi-threading. Quello che succede è che, in caso di abbreviazione dell'interprete, il modulo pertinente (myThread in questo caso) passa attraverso una sorta di del myThread.

La chiamata self.sample() equivale approssimativamente allo myThread.__dict__["sample"](self). Ma se siamo nella sequenza di decompressione dell'interprete, allora il suo dizionario di tipi noti potrebbe aver già cancellato myThread e ora è fondamentalmente un NoneType - e non ha un attributo 'campione'.

0

Python protegge questi membri modificando internamente il nome per includere il nome della classe. È possibile accedere a tali attributi come object._className__attrName.

Problemi correlati