2012-07-27 28 views
31

Mam klasę MyThread. W tym mam próbkę metody. Próbuję uruchomić go z tym samym kontekście obiektu. Proszę spojrzeć na kod:Python AttributeError: Obiekt nie ma atrybutu

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() 

Wygląda bardzo prosto, nie jest. Ale kiedy go uruchomię, pojawia się ten błąd. Teraz mam tę metodę, właśnie tutaj. Co jest nie tak? Proszę o pomoc

Edit: To jest 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' 

Wołam go jak ten

arThreads = [] 
maxThreads = 2; 

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

Niestety nie mogę zakładać redisOps kod klasy. Ale zapewniam cię, że to działa dobrze

+0

Czy zostałby przesłany kompletny błąd do pliku wywoławczego? – sloth

+0

Czy mógłbyś dodać kod, w jaki sposób dzwonisz? – Babu

+2

Czy brakuje jakiegoś kodu. Ten fragment działa dla mnie fien. – ThirdOne

Odpowiedz

59

Twoje wcięcie jest wygłupione, a ty mieszałeś tabulatory i spacje. Uruchom skrypt za pomocą python -tt, aby zweryfikować.

+0

Dzięki za ten otwieracz do oczu. Mam to teraz. Przepraszam za głupie pytanie i zbyt długie wytłumaczenie takiego pytania;) – Shades88

+10

wow Nie wiedziałem "-tt" – n611x007

+0

Tego rodzaju błędy są powszechne, gdy wielowątkowość w Pythonie. Dzieje się tak dlatego, że podczas odrywania tłumacza, odpowiedni moduł (myThread w tym przypadku) przechodzi przez rodzaj "del myThread". – Trevor

5

Tego rodzaju błędy są powszechne w przypadku wielowątkowości w języku Python. To, co się dzieje, polega na tym, że po odłożeniu tłumacza odpowiedni moduł (myThread w tym przypadku) przechodzi przez rodzaj: del myThread.

Połączenie self.sample() jest mniej więcej równoważne myThread.__dict__["sample"](self). Ale jeśli jesteśmy podczas sekwencji odrywania tłumacza, to jego własny słownik znanych typów mógł już zostać usunięty myThread, a teraz jest to w zasadzie NoneType - i nie ma atrybutu "próbka".

0

Python chroni tych członków, wewnętrznie zmieniając nazwę, tak aby zawierała nazwę klasy. Możesz uzyskać dostęp do takich atrybutów jako object._className__attrName.

Powiązane problemy