Tại sao tôi nhận được AttributeError: Đối tượng không có thuộc tính [đã đóng]


81

Tôi có một 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ừ trong cùng một ngữ cảnh đối tượng. Vui lòng xem mã:

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

Trông rất đơn giản phải không. Nhưng khi tôi chạy nó, tôi gặp 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 đỡ

Chỉnh sửa: Đâ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 đang gọi nó như thế này

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ể đăng mã lớp redisOps. Nhưng tôi có thể đảm bảo với bạn rằng nó hoạt động tốt


Có đăng toàn bộ lỗi với callstack không?
lười biếng,

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

2
Có một số mã bị thiếu. Đoạn mã này phù hợp với tôi.
Thứ ba,

2
Tôi vô cùng xin lỗi. Vâng, thụt đầu dòng của tôi đã bị lừa. Hoàn toàn là người mới trong python. Vì vậy, có thể đã bỏ lỡ tầm quan trọng của việc thụt lề.
Shades88

trong khi mã hóa Python, bạn nên chọn "Hiện các tab và không gian" trong trình soạn thảo mã của bạn
vanduc1102

Câu trả lời:


92

Thụt lề của bạn bị sai lệch và bạn đã trộn lẫn các tab và khoảng trắng. Chạy tập lệnh với python -ttđể xác minh.


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

3
Bạn vui lòng cho tôi biết ý nghĩa của "Run script with python -tt to verify" là gì?
akshay_rahar

9
@akshay_rahar:python -tt script.py
Ignacio Vazquez-Abrams

1
Vậy, tham số kỳ diệu này -ttlàm gì? Tôi đã không tìm thấy nó trong các tài liệu
Łukasz Nojek

8
Cập nhật: -ttcờ là không có mặt trong Python 3, đó là bằng Python 2.
Łukasz Nojek

12

Những loại lỗi này thường gặp khi đa luồng Python. Điều xảy ra là, khi trình thông dịch thu nhỏ, mô-đun liên quan ( myThreadtrong trường hợp này) trải qua một loại del myThread.

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


11

Nếu bạn đang sử dụng python 3+, điều này cũng có thể xảy ra nếu bạn đang sử dụng các biến private bắt đầu bằng dấu gạch dưới kép, ví dụ: self .__ yourvariable. Chỉ một số điều cần lưu ý đối với một số bạn có thể gặp phải vấn đề này.


Nó có được ghi trong PIP không?
ngắn ngủi

1
chỉ cần chạy vào vấn đề và tìm thấy bình luận này, tại sao họ lại thiết kế nó như vậy?
matthewhang

7

Điều này cũng có thể xảy ra nếu bạn sử dụng các vị trí trong lớp và chưa thêm thuộc tính mới này vào các vị trí.

class xyz(object):
"""
class description

"""

__slots__ = ['abc', 'ijk']

def __init__(self):
   self.abc = 1
   self.ijk = 2
   self.pqr = 6 # This will throw error 'AttributeError: <name_of_class_object> object has no attribute 'pqr'

2

Tôi gặp lỗi này cho kịch bản đa luồng (cụ thể là khi xử lý ZMQ). Hóa ra là ổ cắm vẫn đang được kết nối trên một luồng trong khi một luồng khác đã bắt đầu gửi dữ liệu. Các sự kiện đã xảy ra do một chuỗi khác đã cố gắng truy cập vào các biến chưa được tạo. Nếu kịch bản của bạn liên quan đến đa luồng và nếu mọi thứ hoạt động nếu bạn thêm một chút độ trễ thì bạn có thể gặp sự cố tương tự.


1

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


0

Tôi cũng đã gặp phải lỗi tương tự. Tôi chắc chắn rằng vết lõm của tôi không có vấn đề gì. Chỉ khởi động lại bán python mới giải quyết được vấn đề.


Bạn có thể đăng các lệnh để khởi động lại hoặc bất cứ điều gì bạn đã làm. Nó có thể hữu ích cho những người mới bắt đầu.
Khan

0

Lỗi tương tự xảy ra khi tôi có một biến khác có tên là mythread. Biến đó đã ghi đè lên điều này và đó là lý do tại sao tôi gặp lỗi


-3

Bạn không thể truy cập bên ngoài các trường riêng tư của một lớp. các trường riêng tư bắt đầu bằng __. ví dụ -

class car:
    def __init__(self):
        self.__updatesoftware()

    def drive(self):
        print("driving")

    def __updatesoftware(self):
        print("updating software:")

obj = car()
obj.drive()  
obj.__updatesoftware()  ## here it will throw an error because 

__updatesoftware là một phương thức riêng tư.


2
Tác giả không cố gắng truy cập vào một phương pháp riêng tư, câu hỏi cũng đã hơn 6 năm và đã được giải quyết rồi nên không cần phải cố gắng trả lời lại.
Johan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.