2012-07-27 79 views
31

Tôi có lớp MyThread. Trong đó tôi có một mẫu phương pháp. Tôi đang cố gắng để chạy nó từ withing cùng một bối cảnh đối tượng. Vui lòng xem mã:Thuộc tính PythonError: Đối tượng không có thuộc tính

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

Có vẻ rất đơn giản phải không. Nhưng khi tôi chạy nó, tôi nhận được lỗi này

AttributeError: 'myThread' object has no attribute 'sample' Bây giờ tôi có phương pháp đó, ngay tại đó. Vì vậy những gì là sai? Xin vui lòng giúp

Edit: Đây là 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' 

Tôi gọi nó như

arThreads = [] 
maxThreads = 2; 

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

Xin lỗi tôi không thể gửi redisOps mã lớp này. Nhưng tôi có thể đảm bảo với bạn rằng nó hoạt động tốt

+0

Sẽ đăng lỗi hoàn chỉnh với callstack? – sloth

+0

bạn có thể vui lòng thêm mã mà bạn đang gọi không? – Babu

+2

Có thiếu mã nào không. Đoạn mã này hoạt động phù hợp với tôi. – ThirdOne

Trả lời

59

Thụt lề của bạn bị bẻ cong và bạn đã trộn lẫn các tab và dấu cách. Chạy tập lệnh với python -tt để xác minh.

+0

Cảm ơn bạn đã mở mắt. Giờ đã hiểu. Xin lỗi cho câu hỏi ngu ngốc và lời giải thích quá dài của một câu hỏi như vậy;) – Shades88

+10

wow Tôi không biết '-tt' – n611x007

+0

Những loại lỗi là phổ biến khi Python đa luồng. Điều gì xảy ra là, trên trình thông dịch xé xuống, mô-đun liên quan (myThread trong trường hợp này) đi qua một loại 'del myThread'. – Trevor

5

Các loại lỗi này phổ biến khi Python đa luồng. Điều gì xảy ra là, trên trình thông dịch xé xuống, mô-đun thích hợp (myThread trong trường hợp này) đi qua một loại del myThread.

Cuộc gọi self.sample() tương đương với myThread.__dict__["sample"](self). Nhưng nếu chúng ta đang ở trong trình tự xé rách của trình thông dịch thì từ điển riêng của các kiểu đã biết có thể đã bị xóa myThread và bây giờ về cơ bản là NoneType - và không có thuộc tính 'mẫu'.

0

Python bảo vệ các thành viên đó bằng cách thay đổi tên nội bộ để bao gồm tên lớp. Bạn có thể truy cập các thuộc tính như object._className__attrName.

Các vấn đề liên quan